Javascript MDN“;对象。是“;备选提案

Javascript MDN“;对象。是“;备选提案,javascript,object,methods,ecmascript-6,Javascript,Object,Methods,Ecmascript 6,我读过。 它为不提供此方法的浏览器提供了替代代码: 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

我读过。 它为不提供此方法的浏览器提供了替代代码:

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;
    };
}
问题很简单:第二个“如果”什么时候是真的

感谢您的关注。

它是这样写的:

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


逻辑是
NaN!==NaN
是唯一出现
的情况==
运算符在同一变量上返回
true
,因此它必须是关于
NaN
比较的。然后,它对
v2
执行相同的检查,并根据结果返回true或false:如果
v2
比较为
true
,则与NaN比较是关于NaN的,因此返回
true
,如果不是,则返回
false
,因为NaN与非NaN的事物永远不一样。

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

var notNaN=new DataView(新的Uint8Array([0x7f,0xf8,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);返回v.getUint8(index);}
byteOf(NaN,7)//0
字节(notNaN,7)//1

所以有两个可区分的值,但是Object.is()表示,它们是相同的==NaN将返回true,但不是NaN==楠。。。这里v1是针对v1进行测试的。。。这意味着NaN对NaN或Number.NaN对Number.NaN。我还是不明白…
Number.NaN
NaN
,没关系。JavaScript在逻辑上只有一个
NaN
。为清楚起见,NaN===NaN将为false。NaN只是Number.NaN的别名