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.