比较未定义和错误的非常奇怪的行为
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 当然!undefined
是true
。
参见 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"
【讨论】:
==
与 ===
在比较 false
和 undefined/null
时没有区别,尤其是在这种情况下,即使在比较之前所有内容都转换为相同的类型,也没有区别。
抱歉,我不是这个意思。我更新了我的答案以使其更清楚。【参考方案3】:
console.log(!undefined)
// true
console.log(!false)
// true
console.log(!!undefined)
// false
console.log(!!false)
// false
【讨论】:
以上是关于比较未定义和错误的非常奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
让 accounts = web3.eth.getAccounts() 显示未定义和 app.vote(1, from: accounts[1] ) 显示错误