MDN“Object.is”替代提案

Posted

技术标签:

【中文标题】MDN“Object.is”替代提案【英文标题】:MDN "Object.is" alternative proposal 【发布时间】:2014-02-24 06:59:18 【问题描述】:

我已阅读the MDN page on the "Object.is" method。 它为不提供此方法的浏览器提供了替代代码:

if (!Object.is) 
    Object.is = function(v1, v2) 
        if (v1 === 0 && v2 === 0) 
            return 1 / v1 === 1 / v2;
        
        if (v1 !== v1) 
            return v2 !== v2;
        
        return v1 === v2;
    ;

问题很简单:第二个“如果”何时才能成立?

感谢您的关注。

【问题讨论】:

【参考方案1】:

请注意,我们有不止 1 个 NaN:

var notNaN = new DataView(new Uint8Array([0x7f, 0xf8,0,0,0,0,0,1]).buffer).getFloat64(0)
Object.is(notNaN, NaN) // true

const byteOf = (number, index) => let v = new DataView(new ArrayBuffer(8)); v.setFloat64(0, number); return v.getUint8(index);

byteOf(NaN, 7) // 0
byteOf(notNaN, 7) // 1

所以有两个可区分的值,但是 Object.is() 说,它们是相同的

【讨论】:

【参考方案2】:

有点像the same article:

这也不等于根据 === 操作员。 === 运算符(以及 == 运算符)将 数值 -0 和 +0 相等,它将 Number.NaN 视为不 等于 NaN

逻辑是NaN !== NaN!==操作符在同一个变量上返回true的唯一情况,所以一定是关于NaN比较。然后它对v2 进行相同的检查,并根据结果返回true 或false:如果v2 比较是true,它与NaN 相比大约是NaN,所以返回true,如果不是则返回@ 987654330@ 因为 NaN 永远不会与不是 NaN 的东西相同

【讨论】:

好吧,文章说只有 Number.NaN!==NaN 会返回 true 而不是 NaN!==NaN ...这里 v1 针对 v1 进行测试...这意味着 NaN 针对 NaN 或Number.NaN 对 Number.NaN。我还是不明白…… Number.NaNNaN,没关系。 javascript 逻辑上只有一个NaN 为了清楚起见,NaN===NaN 将是错误的。 NaN 只是 Number.NaN 的别名

以上是关于MDN“Object.is”替代提案的主要内容,如果未能解决你的问题,请参考以下文章

Object构造函数的方法 之 Object.is

判断两个值是否相同——Object.is( )

ECMA6 002 Object.is()

[ECMAScript] Object.is()和比较操作符“=“的区别是什么

JS 相等判断(==,===,Object.is)

javascript ES5实现Object.is