空数组是真的,但它们也等于false.
var arr = [];
console.log('Array:', arr);
if (arr) console.log("It's true!");
if (arr == false) console.log("It's false!");
if (arr && arr == false) console.log("...what??");Run Code Online (Sandbox Code Playgroud)
我想这是由于等于运算符操作的隐式转换.
任何人都可以解释幕后发生的事情吗?
可能重复:
空JavaScript阵列的冲突布尔值
这个事实背后的理由是什么?
[ ([] == false), ([] ? 1 : 2) ]
Run Code Online (Sandbox Code Playgroud)
回来了[true, 1]?
换句话说,空列表在布尔上下文中逻辑上为真,但等于false.
我知道使用===解决了这个问题,但这个显然完全不合逻辑的选择背后的解释是什么?
换句话说,这被认为是语言中的一个错误,一些无意识的事情刚刚发生并且无法修复,因为它太晚或者真的在语言设计中有人认为这种明显的疯狂是我很酷的我是对许多程序员来说肯定很混乱?
对于如何发生这种情况的技术解释同时令人惊讶和惊吓,但我对这种设计背后的内容更感兴趣.
我接受了非常详细的Nick Retallack解释,即使它只是关于为什么[]==false是真的技术原因:令人惊讶的是它发生的原因是因为[]转换为字符串是一个空字符串而空字符串数值是特殊的来自0而不是显然更符合逻辑NaN.例如,对于空对象,比较({}) == false返回false,因为空对象的字符串表示形式不是空字符串.
我的好奇心仍然是所有这一切都是出乎意料的(现在不幸在标准中固化).
在JavaScript中,我注意到[]==![]结果是true.演示
我不明白这个结果.你能解释一下原因吗?
正如你在这个javascript平等表中看到的那样,javascript平等传递性很奇怪.
我理解该表的大部分结果,但我对以下比较有疑问:
[] == true // false
[] == false // true
!![] == true // true
!![] == false // false
Run Code Online (Sandbox Code Playgroud)
但是也:
if ([]) {
// this code will run
}
if (!![]) {
// and of course this too
}
Run Code Online (Sandbox Code Playgroud)
为什么?这是另一个极端不好的部分吗?有这个合理的解释吗?