Javascript假值(null,undefined,false,空字符串:""或''和0)和比较(==)运算符

Sur*_*mar 19 javascript null undefined

当我使用的值中的任何一个(null,undefined,false,'',0在一)if声明中,它始终评估为谬误(false).此外,这些值((的否定null,undefined,false,'',0)在if声明中始终评估为重言式(true).

 if(null){
 }else{
 }

 if(undefined){
 }else{
 }

 if(false){
 }else{
 }

 if(''){
 }else{
 }

 if(0){
 }else{
 }
Run Code Online (Sandbox Code Playgroud)

在所有上述情况中,if语句被评估为false&elsestatement执行.但是,当我将这些谬误值与==运算符进行比较时,它并不true总是返回.令人惊讶的是,true当我比较这些值的否定时,它总是返回值.

如果double equalto(==)运算符检查/比较值而不是严格的类型,那么为什么:

null == false          // returns false

null == 0              // returns false

null == ''             // returns false
Run Code Online (Sandbox Code Playgroud)

但,

!null == !false       // returns true

!null == !0           // returns true

!false == !undefined  // returns true
Run Code Online (Sandbox Code Playgroud)

和,

null == undefined     // returns true

false == 0            // returns true
Run Code Online (Sandbox Code Playgroud)

我明白,如果任何一个都可以阐明这些值(中的行为或关系null,undefined,false,'',0).

coo*_*ter 15

一种常见的误解

"...如果double equalto(==)运算符仅检查/比较值而不是类型......"

这是一个不正确的假设,尽管它经常被人们重复.实际上,== 确实检查类型,实际上比===对比更注重类型.

参见抽象等式比较算法.

一个==比较没有做一个简单的toBoolean转换.相反,它通过一个有点复杂的递归算法,在检查类型后,如果它们不匹配,则尝试将操作数强制转换为相同的类型.

它执行的类型强制非常特定于操作数的类型.对于不同类型对,可以发生不同的强制序列.通常(但并非总是)它最终最终将操作数强制转换为number类型.


为什么!操作数会改变事物

当您手动强制使用两个操作数时!,您现在正在进行简单的toBoolean转换,导致类型匹配,这避免了算法的类型强制部分,使其行为基本上类似于严格等式比较算法.

因此,==当类型不匹配时,预测比较结果的唯一方法是理解抽象算法.


别忘了 NaN

还有,还有一个值得考虑的"假"价值NaN.无论如何,它的==比较总是如此false.即使比较其他NaN价值,它也会false.


Tod*_*tto 1

undefined: 表示变量已声明但未赋值

null:null值已经被赋值,表示没有值

false''0想你大概能明白这些是什么意思。