判断两个值是否相同——Object.is( )
Object.is(value1, value2);
返回一个boolean
说明
Object.is()
用于确定两个值是否相同,两个值相同有如下的几种情况:
-
都是
undefined
-
都是
-
都是
true
或false
-
是长度相同的两个字符串,并且每个序号对应的字符相同
-
相同的两个对象(两个对象有相同的引用地址)
-
两个相同的数字:
-
都是
+0
-
都是
-0
-
都是
NaN
-
都不是
0
且不是NaN
,并且值相同
-
Object.is
与 ==
运算符得到的结果不一样。==
会在比较之前对符号两边的值进行强制类型转换(当他们类型不同时)。
Object.is
与 ===
运算符得到的结果也不一样。- 0 === + 0
是 true
,而Number.NaN === NaN
是 false
。
函数实现
if (!Object.is) { Object.is = function(x, y) { // SameValue algorithm if (x === y) { // Steps 1-5, 7-10 // Steps 6.b-6.e: +0 != -0 return x !== 0 || 1 / x === 1 / y; } else { // Step 6.a: NaN == NaN return x !== x && y !== y; } }; }
使用示例
Object.is('foo', 'foo'); // true Object.is(window, window); // true Object.is('foo', 'bar'); // false Object.is([], []); // false var foo = { a: 1 }; var bar = { a: 1 }; Object.is(foo, foo); // true Object.is(foo, bar); // false Object.is(null, null); // true // Special Cases Object.is(0, -0); // false Object.is(-0, -0); // true Object.is(NaN, 0/0); // true
兼容性
不支持ie
比较 ==
、===
、Object.is、
SameValueZero
x | y | == | === | Object.is | SameValueZero |
---|---|---|---|---|---|
undefined |
undefined |
true |
true |
true |
true |
null |
null |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
false |
false |
true |
true |
true |
true |
'foo' |
'foo' |
true |
true |
true |
true |
0 |
0 |
true |
true |
true |
true |
+0 |
-0 |
true |
true |
false |
true |
+0 |
0 |
true |
true |
true |
true |
-0 |
0 |
true |
true |
false |
true |
0 |
false |
true |
false |
false |
false |
"" |
false |
true |
false |
false |
false |
"" |
0 |
true |
false |
false |
false |
'0' |
0 |
true |
false |
false |
false |
'17' |
17 |
true |
false |
false |
false |
[1, 2] |
'1,2' |
true |
false |
false |
false |
new String('foo') |
'foo' |
true |
false |
false |
false |
null |
undefined |
true |
false |
false |
false |
null |
false |
false |
false |
false |
false |
undefined |
false |
false |
false |
false |
false |
{ foo: 'bar' } |
{ foo: 'bar' } |
false |
false |
false |
false |
new String('foo') |
new String('foo') |
false |
false |
false |
false |
0 |
null |
false |
false |
false |
false |
0 |
NaN |
false |
false |
false |
false |
'foo' |
NaN |
false |
false |
false |
false |
NaN |
NaN |
false |
false |
true |