NaN是假的吗?为什么NaN === false返回false

sc1*_*013 23 javascript

  1. 为什么NaN === false=>假,是不是NaN麻痹?
  2. 为什么NaN === NaN=> false,但!!NaN === !!NaN=> true

我一直绞尽脑汁试图解决这个问题.

ale*_*lex 30

  1. 虚假和严格等同false是非常不同的东西,这就是为什么一个人y而不是一个e.;)
  2. NaN被指定永远不会等于任何东西.问题的第二部分是比较false === false,这很有趣,true:)

  • 并且(NaN!== NaN)返回true.NaN是唯一与自身不相等的JavaScript值. (3认同)
  • 哇!不知道这一点 (NaN === NaN) === false (2认同)

Rob*_*obG 12

1.为什么NaN === false => false,是不是NaN麻痹?

ECMA-262中没有定义术语"falsy",这是类型转换将值强制为false的行话.例如

var x = NaN;

if (!x) {
  console.log('x is "falsy"');
}
Run Code Online (Sandbox Code Playgroud)

严格相等运算符使用严格相等比较算法来检查参数是否具有相同的类型,并且NaN是类型编号,而false类型为布尔值,因此根据类型计算它们不相等,没有值的比较.

2.为什么NaN === NaN => false,但是!! NaN === !! NaN => true

因为严格的相等比较算法表明了这一点NaN !== NaN,因此是isNaN方法.

用!使用抽象ToBoolean方法将参数强制!NaN 转换为boolean ,其中转换为true!!NaN转换为false,因此:

!!NaN === !!NaN  -->  false === false  -->  true
Run Code Online (Sandbox Code Playgroud)

请注意,抽象等式运算符==将根据抽象等式比较算法的规则将参数强制为相同的类型.在这种情况下,NaN是类型编号,因此使用返回的toNumberfalse转换为数字.而且不等于NaN所以:00

NaN == false  -->  NaN == 0  -->  false
Run Code Online (Sandbox Code Playgroud)


Ja͢*_*͢ck 7

这个条件:

NaN === false
Run Code Online (Sandbox Code Playgroud)

总是false因为数字不是布尔值。要测试某个值是否为假,您可以使用三元表达式:

NaN ? "truthy" : "falsy" // falsy
Run Code Online (Sandbox Code Playgroud)

为什么 NaN === NaN => false

MDN对此进行了解释;但从实用角度来说,两个你只知道它们不是数字的值在逻辑上不可能是同一件事。

...但是为什么 !!NaN === !!NaN => true

这是因为转换NaN为布尔值将使它false和布尔值可以正常进行比较。