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.NaN
或 NaN
,没关系。 javascript 逻辑上只有一个NaN
。
为了清楚起见,NaN===NaN 将是错误的。 NaN 只是 Number.NaN 的别名以上是关于MDN“Object.is”替代提案的主要内容,如果未能解决你的问题,请参考以下文章