介绍:
-
与ES5 的严格相等运算符 === 行为基本一致
-
和=== 有两个不同
- +0 不等于-0
- NaN 等于NaN
0 === -0 //true 0 === +0 // true +0 === -0 //true NaN === NaN // falseObject.is(0,+0) // true Object.is(0,-0) // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
注意事项:
Object.is() 是同值相等。 对象是引用类型,两个{} 其实是两个地址,并不相等。
eg1: 两个{}不相等
Object.is('foo', 'foo') // true
Object.is({}, {}) // false
eg2: 引用地址相同则相等
var a = {a:1}
var b = {a:1}
var c = a
// a 和 b 不相等
Object.is(a,b) // false
a===b // false
// a 和 c 相等
Object.is(a,c) // true
a===c // true
那么这种情况下,a和c是同一个引用地址,所以两种判断下行为一致都是true。而a和b虽然内容一样,但是地址不一样,所以不能定义为相等。
ES5 实现Object.is()
function is(x,y){
if(x===y){
return x!==0 || 1/x ===1/y;
}
return x!==x && y!==y
}
📢:React 源码中 进行浅比较时对基础数据的比较里就使用了上述函数