比较未定义和错误的非常奇怪的行为

Posted

技术标签:

【中文标题】比较未定义和错误的非常奇怪的行为【英文标题】:Very strange behaviour comparing undefined and false 【发布时间】:2012-06-14 12:40:01 【问题描述】:

我在控制台中有这个输出:

console.log((!undefined)==(!false)) // true (fine)
console.log((!!undefined)==(!!false)) // true (still fine)

据我所知,!!x==x,不是吗?

console.log((undefined)==(false)) // false

谁能告诉我为什么返回 false?

!!false==false!!undefined==undefined 不是真的吗?

【问题讨论】:

虚假的undefined 值在用于! 等逻辑运算符时被强制转换为false:11heavens.com/falsy-and-truthy-in-javascript 对此有任何参考(官方)吗? logical not operator 当然!undefinedtrue 参见 ECMAScript 标准的 logical NOT operator,它调用了 toBoolean。 toBoolean 是真假魔术发生的地方,在标准中列为明确的案例。 【参考方案1】:

是的。 !!x 返回 x。 !undefined 强制 undefined 到布尔值false,然后找到!((bool)undefined)=!false,如果我们使用 C++ 转换符号。所以!!undefined 给出!!((bool)undefined)=!!(false)=!true=false,而不是undefined

【讨论】:

任何(官方)参考强调这种行为?【参考方案2】:

Undefined 不是 boolean 类型,像 false 所以直接比较它们时,它们是不相等的。

有关其他比较陷阱,请参阅 here。

typeof(undefined)
"undefined"

typeof(false)
"boolean"

【讨论】:

===== 在比较 falseundefined/null 时没有区别,尤其是在这种情况下,即使在比较之前所有内容都转换为相同的类型,也没有区别。 抱歉,我不是这个意思。我更新了我的答案以使其更清楚。【参考方案3】:
console.log(!undefined)
// true
console.log(!false)
// true
console.log(!!undefined)
// false
console.log(!!false)
// false

【讨论】:

以上是关于比较未定义和错误的非常奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义和未处理的承诺拒绝的属性“捕获”

检查jQuery中的未定义和空值

具有未定义和空值的排序对象数组

让 accounts = web3.eth.getAccounts() 显示未定义和 app.vote(1, from: accounts[1] ) 显示错误

成员变量 - 未定义和不可访问

React 呈现未定义和更新的状态