ES6 Object.is() 和严格相等运算符=== 的区别

83 阅读1分钟

介绍:

  • 与ES5 的严格相等运算符 === 行为基本一致

  • 和=== 有两个不同

    • +0 不等于-0
    • NaN 等于NaN
    
        0 === -0 //true
        0 === +0 // true
        +0 === -0 //true 
    
        NaN === NaN // false 
    
        Object.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

// ab 不相等
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 源码中 进行浅比较时对基础数据的比较里就使用了上述函数