Object.is(value1, value2) 静态方法确定两个值是否为相同值。
如果以下其中一项成立,则两个值相同
- 都是 [
undefined] - 都是 [
null] - 都是
true或者都是false - 都是长度相同、字符相同、顺序相同的字符串
- 都是相同的对象(意味着两个值都引用了内存中的同一对象)
- 都是
BigInt且具有相同的数值 - 都是
symbol且引用相同的symbol值 - 都是数字且
- 都是
+0 - 都是
-0 - 都是
NaN - 都有相同的值,非零且都不是
NaN
- 都是
Object.is 和运算符
==进行类型转换(如果它们不是相同的类型),Object.is()不会对其操作数进行类型转换===运算符(和==运算符)将数值-0和+0视为相等,但是会将NaN视为彼此不相等
Object.is = function (x, y) {
if (x === y) {
// 当前情况下,只有一种情况是特殊的,即 +0 -0
// 如果 x !== 0,则返回true
// 如果 x === 0,则需要判断+0和-0,则可以直接使用 1/+0 === Infinity 和 1/-0 === -Infinity来进行判断
return x !== 0 || 1 / x === 1 / y;
}
// x !== y 的情况下,只需要判断是否为NaN,如果x!==x,则说明x是NaN,同理y也一样
// x和y同时为NaN时,返回true
return x !== x && y !== y;
};
// 案例 1:评估结果和使用 === 相同
Object.is(25, 25); // true
Object.is("foo", "foo"); // true
Object.is("foo", "bar"); // false
Object.is(null, null); // true
Object.is(undefined, undefined); // true
Object.is(window, window); // true
Object.is([], []); // false
const foo = { a: 1 };
const bar = { a: 1 };
const sameFoo = foo;
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(foo, sameFoo); // true
// 案例 2: 带符号的 0
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true
// 案例 3: NaN
Object.is(NaN, 0 / 0); // true
Object.is(NaN, Number.NaN); // true