为啥 == false 评估为 false 而 [] == false 评估为 true?
Posted
技术标签:
【中文标题】为啥 == false 评估为 false 而 [] == false 评估为 true?【英文标题】:Why does == false evaluate to false while [] == false evaluates to true?为什么 == false 评估为 false 而 [] == false 评估为 true? 【发布时间】:2015-03-15 08:56:01 【问题描述】:为什么 == false
在javascript 中计算为false
而[] == false
计算为true
?
【问题讨论】:
因为 javascript, google "wat" + javascript (Destroy All Software Talks) 对于额外的嘘声和咯咯笑声:if([])alert("wtf")
==
喜欢将内容作为数字或字符串进行比较,因此 ==="objectObject" 而将 []=="" 作为字符串进行比较
【参考方案1】:
这是根据Abstract Equality Comparison Algorithm进行的类型转换:
== false // step 7 == ToNumber(false)
== 0 // step 9 ToPrimitve() == 0
"[object Object]" == 0 // step 5 ToNumber("[object Object]") == 0
NaN == 0 // step 1.c.i
[] == false // step 7 [] == ToNumber(false)
[] == 0 // step 9 ToPrimitve([]) == 0
"" == 0 // step 5 ToNumber("") == 0
0 == 0 // step 1.c.iii
参考:ToNumber、ToPrimitive
因此,更喜欢使用严格比较。
ToPrimitive
如何在比较过程中将对象转换为基元的一些示例。默认情况下,将调用对象的valueOf
方法,如果valueOf
没有返回原始值,则调用toString
。对于Date
对象,默认情况下会调用toString
。
var obj = ;
obj.valueOf(); // Object // the object itself
obj.toString(); // "[object Object]"
obj.valueOf = function() return 123; ;
obj == 123; // true
obj.toString = function() return 'foo bar'; ;
obj == 123; // false
obj == 'foo bar'; // true
// Date object
var date = new Date();
date.valueOf(); // 1421430720379
date.toString(); // "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)"
date == 1421430720379 // false
date == "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)" // true
date.toString = function() return 'foo'; ;
date == 'foo'; // true
【讨论】:
这是否意味着所有对象的原语都是字符串? @FelixKling 顺便说一句,感谢您提供如此明确的答案! :) 比这要复杂一些。 ToPrimitive 接受一个提示,该提示应指示对象是否应转换为数字或字符串。如果未提供任何提示,则 Date 对象的默认值为“string”,所有其他对象的默认值为“number”。如果是“数字”,则调用该对象的valueOf
方法。 但是如果该方法不返回原始值,它会退回到toString
。默认情况下,valueOf
只是返回对象本身,所以它不是原始对象。
添加了一些如何将对象转换为基元的示例。
完美!正是我想要的!非常感谢!以上是关于为啥 == false 评估为 false 而 [] == false 评估为 true?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 parseInt(key) === NaN 总是评估为 false
为啥 list.append 在布尔上下文中评估为 false? [复制]
一种语言将 undefined 评估为等于 false 是不是常见?如果是这样,为啥要这样做?
如果评估的变量为 False,为啥我的 django 模板中的这个 IF 语句会执行?