四种判断相等性的方法
在 JavaScript 中,判断两个值是否相等有四种主要的方法。
全等 ===
全等运算符(===
)用于判断两个值是否严格相等。它不会进行类型转换,只有当值的类型和值都相同时,才会返回 true
。
const a = 5;
const b = '5';
console.log(a === b); // false
等于 ==
等于运算符(==
)在比较前会进行类型转换。如果两个值在转换后相等,则返回 true
。
const a = 5;
const b = '5';
console.log(a == b); // true
零值相等 +0 === -0
在比较正零和负零时,+0
和 -0
会被认为是相等的。
console.log(+0 === -0); // true
同值相等 Object.is(+0, -0)
和 Object.is(NaN, NaN)
同值相等使用 Object.is()
方法进行比较。它认为 +0
和 -0
是不同的,且 NaN
等于自身。
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
JS 相等判断操作
在 JavaScript 中,判断相等性的操作主要有以下几种:
严格相等
严格相等(===
)的特点包括:
- 不进行隐式类型转换。
- 原始值比较时,类型和值都必须相同。
- 引用值比较时,必须指向同一内存地址。
NaN
与任何值都不相等。+0 === -0
返回true
。
// 严格相等 === Strict equality
const a = 10;
const b = 10;
console.log(a === b); // true
const obj1 = { key: 'value' };
const obj2 = { key: 'value' };
console.log(obj1 === obj2); // false
非严格相等
非严格相等(==
)的特点包括:
- 比较前可能进行隐式类型转换。
- 转换后,使用严格相等判断。
null
和undefined
只相等于彼此。- 窄对象(Narrow Object):在
IE
的DOM
中出现的一些对象,类似于document.all
。
// 非严格相等 == Loose Equality
const a = '5';
const b = 5;
console.log(a == b); // true
console.log(null == undefined); // true
console.log(null === undefined); // false
JavaScript 中的相等性判断 - JavaScript | MDN
同值相等
同值相等使用 Object.is()
方法,它的比较规则如下:
+0 !== -0
NaN === NaN
const obj = {};
Object.defineProperty(obj, 'myZero', {
value: -0,
writable: false,
configurable: false,
enumerable: false,
});
Object.defineProperty(obj, 'myZero', {
value: -0,
});
console.log(Object.is(obj.myZero, -0)); // true
console.log(Object.is(obj.myZero, +0)); // false
在同值相等的情况下,NaN === NaN
。
const objNaN = {};
Object.defineProperty(objNaN, 'myValue', {
value: NaN,
writable: false,
configurable: false,
enumerable: false,
});
Object.defineProperty(objNaN, 'myValue', {
value: NaN,
});
console.log(Object.is(objNaN.myValue, NaN)); // true
ES6 Object.is
Object.is()
是 ES6 引入的新方法,用于判断两个值是否是同一个值。它不进行隐式类型转换,比较更为严格。
// Object.is(v1, v2) ES6 新的 API,用于判断两个参数是否是同一个值
参数是两个值,返回布尔
Object.is()
接受两个参数,返回一个布尔值,表示这两个参数是否相等。
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is('hello', 'hello')); // true
console.log(Object.is({}, {})); // false
实现 Object.is()
以下是 Object.is()
的实现示例,通过自定义方法 Object.myIs
来模仿其行为:
Object.myIs = function (a, b) {
if (a === b) {
// 处理 +0 和 -0
return a !== 0 || 1 / a === 1 / b;
}
// 处理 NaN
return a !== a && b !== b;
};
console.log(Object.myIs(NaN, NaN)); // true
console.log(Object.myIs(+0, -0)); // false
console.log(Object.myIs(5, 5)); // true
console.log(Object.myIs('test', 'test')); // true
console.log(Object.myIs({}, {})); // false
这种实现方式确保了 Object.myIs
在比较时能正确处理 NaN
和 +0
与 -0
的特殊情况。