ES5实现Object.is()

ES5中的=====存在着问题,==会自动转换数据类型;===情况下NaN不等于NaN,+0等于-0

NaN === NaN     //false
+0 === -0       //true

ES6中的Object.is() 判断两个值是否相同。即只要两个值是一样的,它们就应该相等。

Object.is(NaN, NaN)     //true

Object.is(+0, -0)       //false

如果下列任何一项成立,则两个值相同:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
  • 都是正零 +0
    都是负零 -0
    都是 NaN
    都是除零和 NaN 外的其它同一个数字

在ES5中可以实现Object.is() 的polyfill

if (!Object.is) {
  Object.is = function(x, y) {
    if (x === y) { // Steps 1-5, 7-10
      // 针对 +0不等于-0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // 针对 NaN等于NaN
      return x !== x && y !== y;
    }
  };
}

或者使用Object.defineProperty()在Object定义一个新属性is

Object.defineProperty(Object, 'is', {

    value:function(x,y){

        if(x == y){
            //针对 +0不等于-0
            return x !== x || 1/x === 1/y;
        }
        //针对 NaN等于NaN
        return x !== x && y !== y;

    },

    configurable:true,
    enumerable:false,
    writable:true

});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值