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

时间:2014-03-24 02:44:34

标签: javascript

  1. 为什么NaN === false =>是的,不是NaN falsy?
  2. 为什么NaN === NaN =>是的,但是!!NaN === !!NaN =>真
  3. 我一直绞尽脑汁试图解决这个问题。

7 个答案:

答案 0 :(得分:24)

  1. Falsy 并且严格等于false是非常不同的事情,这就是为什么一个人有y而不是e的原因。 ;)
  2. NaN规范永远不会等同于任何事情。问题的第二部分是比较false === false,这很有趣,true:)

答案 1 :(得分:12)

  

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

ECMA-262中没有定义术语“falsy”,这是类型转换将值强制为false的行话。 e.g。

var x = NaN;

if (!x) {
  console.log('x is "falsy"');
}

严格相等运算符使用Strict Equality Comparison Algorithm检查参数是否为相同的类型,NaN是类型号,而false是类型布尔值,因此它们被评估为不基于类型相等,没有值的比较。

  

2.为什么NaN === NaN =>是的,但是!! NaN === !! NaN =>真

因为严格的相等比较算法指出NaN !== NaN,因此isNaN方法。

使用!使用抽象ToBoolean方法将参数强制转换为布尔值,其中!NaN 转换为 true !!NaN转换为 false ,所以:

!!NaN === !!NaN  -->  false === false  -->  true

请注意,抽象等式运算符==将根据Abstract Equality Comparison Algorithm的规则强制将参数强制为相同的类型。在这种情况下, NaN 是类型编号,因此 false 将使用返回0 toNumber 转换为数字。并且0不等于 NaN 所以:

NaN == false  -->  NaN == 0  -->  false

答案 2 :(得分:4)

这个条件:

NaN === false

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

NaN ? "truthy" : "falsy" // falsy
  

为什么NaN === NaN =>假

MDN中对此进行了解释;但实际上,两个你只知道它们不是数字的值在逻辑上可能是相同的。

  

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

这是因为将NaN强制转换为布尔值将使false和布尔值可以按照正常情况进行比较。

答案 3 :(得分:0)

===比较类型和值。

即使NaN是假的,===也不是比较它的方法。有些东西是假的"如果它在布尔表达式中求值为false。这不等于等于(或相当于)假。

例如,null == false返回false,即使null为假。这不是完全直观的,但这只是JavaScript处理错误/虚假值的方式。

0和空字符串("")是特殊情况,其中与false的值相等比较评估为true(即0 == false"" == false)。但是,0===false""===false仍会返回false。

NaN的特殊之处在于它没有真正的价值,因此将其与自身进行比较并不会返回true。基本上,NaN等于零,甚至不等于NaN

可靠地将某些内容与NaN进行比较的唯一方法是使用isNaN( value )


到第二点,!value是一个布尔表达式。 value首先将类型强制转换为布尔值(记住,NaN是假的),然后布尔值NOT !使其成立。碰巧,它被双重否定,因此!!NaN与布尔false相同。当然是false === false,因此表达式的计算结果为true

答案 4 :(得分:0)

  
      
  1. 为什么NaN === false =>是的,不是NaN falsy?
  2.   
您正在使用的

NaN是使用global property初始化的value of Not-A-Number。它不是布尔值。 It's NaN data type as defined by IEEE 754

同样的事情""您比较null === false(甚至null == false)。

在这种情况下,使用sctric等于或不存在差异: NaN == false,也会返回false!

  
      
  1. 为什么NaN === NaN =>是的,但是!! NaN === !! NaN =>真
  2.   
根据定义,

2.1。 NaN ==== NaN为false。

2.2。但是在!!NaN === !!NaN,你不再比较NaN了,当你做 [value]时,你"评价"它(或转换为布尔值)。

我现在要用null解释,因为它更常用,所以你可以将它应用到NaN

投射NaN,与投射null相同。

null == false? true : false     // false! because it's not a bool false.<br>
!null? true: false              // true! because !null -> true -> if(true)...

更多参考:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.1.1
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN

答案 5 :(得分:0)

NaN和false都是Falsy的子集。

  • NaN == false - &gt;他们都是假的 - &gt;因此&#39; TRUE&#39;
  • NaN === false - &gt;他们是相同的类型 - &gt;因此&#39; FALSE&#39;

答案 6 :(得分:0)

此比较还返回false

const x = NaN
const y = x

console.log(x === y) // false