NaN === false
=>是的,不是NaN falsy?NaN === NaN
=>是的,但是!!NaN === !!NaN
=>真我一直绞尽脑汁试图解决这个问题。
答案 0 :(得分:24)
false
是非常不同的事情,这就是为什么一个人有y
而不是e
的原因。 ;)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)
您正在使用的
- 为什么NaN === false =>是的,不是NaN falsy?
醇>
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!
根据定义,
- 为什么NaN === NaN =>是的,但是!! NaN === !! NaN =>真
醇>
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的子集。
答案 6 :(得分:0)
此比较还返回false
:
const x = NaN
const y = x
console.log(x === y) // false