在Javascript中包含NaN时,比较是如何计算的?

在Javascript中包含NaN时,比较是如何计算的?,javascript,nan,Javascript,Nan,我理解这背后的原因。我对技术实现很好奇。在什么地方找不到这个 我的理论是,只要在任何比较中对左NaN求值,它就会自动返回false,而根本不执行比较。这是否正确?是-如果两种类型相同,并且它们都是数字,那么如果左侧类型为NaN,则结果为false,而不检查右侧类型的值: 7.2.13严格平等比较 比较x===y,其中x和y是值,生成true或false。这样的比较如下所示: 如果类型(x)与类型(y)不同,则返回false 如果类型(x)未定义,则返回true 如果类型(x)为Null,则返回

我理解这背后的原因。我对技术实现很好奇。在什么地方找不到这个


我的理论是,只要在任何比较中对左NaN求值,它就会自动返回false,而根本不执行比较。这是否正确?

是-如果两种类型相同,并且它们都是数字,那么如果左侧类型为
NaN
,则结果为
false
,而不检查右侧类型的值:

7.2.13严格平等比较

比较x===y,其中x和y是值,生成true或false。这样的比较如下所示:

如果类型(x)与类型(y)不同,则返回false

如果类型(x)未定义,则返回true

如果类型(x)为Null,则返回true

如果类型(x)是数字,则

  • 如果x为NaN,则返回false。

  • 如果y为NaN,则返回false

  • 如果x与y的数值相同,则返回true

  • 如果x为+0,y为−0,返回true

  • 如果x是−0且y为+0,返回true

  • 返回false


只是想澄清一点,关于如何。对于@CertainPerformance(正确)的回答,我很惊讶下面的代码导致“a”的值被“覆盖”

但是仔细阅读摘录,我推测typeof(x())是在幕后调用的,这将导致重写


换句话说,这不是一个完整意义上的短路

它是根据IEEE 754实现的:@MichaelJasper OP专门询问逻辑是如何实现的,而不是为什么——“什么是理由”是关于“为什么”,而不是“如何”。我更多地是在寻找公认的答案,它显示了从头到尾一步一步的求值。在开始检查
==
之前,需要将两侧求值为单个值,这样类型比较才有意义(并且必须在任何其他操作之前完成与
==
的类型比较,即使在
之前,如果类型(x)是数字,那么…
部分). 因此,必须调用
x
函数,以便在执行
=
检查之前,右侧的计算结果为单个值。@CertainPerformance。如果你说的不仅仅是“南”,而是任何比较,那么你似乎是对的。我将上面的“NaN”替换为4,而“a”同样被覆盖。我做了一些类似于字符串比较的事情,然后再次重写。很高兴知道。
let a = 'overwrite me';

let x = () => {
  a = 'overwritten'; 
  return 7;
}

NaN === x();

alert(a);