我理解这背后的原因。我对技术实施感到好奇。无法在某个地方找到这个。
我的理论是,只要在任何比较中评估左NaN,它就会自动返回false而根本不进行比较。它是否正确?
是 - 如果两种类型相同,并且它们是数字,那么如果左边的是NaN
,那么结果是false
,而不检查正确值的值:
https://www.ecma-international.org/ecma-262/6.0/#sec-strict-equality-comparison
7.2.13严格的平等比较
比较x === y,其中x和y是值,产生真或假。这样的比较如下进行:
如果Type(x)与Type(y)不同,则返回false。
如果Type(x)是Undefined,则返回true。
如果Type(x)为Null,则返回true。
如果Type(x)是Number,那么
- 如果x是NaN,则返回false。
- 如果y是NaN,则返回false。
- 如果x与y的Number值相同,则返回true。
- 如果x是+0且y是-0,则返回true。
- 如果x是-0且y是+0,则返回true。
- 返回false。
...
只是为了澄清如何处理。鉴于@ CertainPerformance(正确)答案,我很惊讶,下面的代码导致“a”的值被“覆盖”。
let a = 'overwrite me';
let x = () => {
a = 'overwritten';
return 7;
}
NaN === x();
alert(a);
但仔细阅读摘录后,我会收集到typeof(x())在幕后调用,这会导致覆盖。
换句话说,这不是一个最完整意义上的短路。