我读过"Object.is“方法上的MDN页面。它为不提供此方法的浏览器提供了另一种代码:
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;
};
}问题很简单:什么时候第二个“如果”才是真的?
感谢您的关注。
发布于 2014-01-31 14:37:37
它是用同一条写的
根据===运算符,这与相等也不一样。===运算符(以及==运算符)将数字值-0和+0视为相等,将Number.NaN视为不等于NaN。
逻辑是NaN !== NaN是!==操作符在同一变量上返回true的唯一情况,所以它必须是关于NaN比较的。然后,它对v2执行相同的检查,并根据结果返回false :如果v2比较是true__,那么与NaN相比,它是关于NaN的,因此返回true__,如果不返回false,则返回false,因为NaN永远不会与非NaN的事物相同。
发布于 2019-11-12 16:29:19
请注意,我们只有超过一个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()说,它们是相同的
https://stackoverflow.com/questions/21482500
复制相似问题