为啥 == 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 【问题描述】:

为什么 == falsejavascript 中计算为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 语句会执行?

为啥空列表在 Python 的 while 循环中计算为 False

为啥将变量与 0.0 进行比较会返回 false? [复制]