为什么 {} == false 的结果是 false 而 [] == false 的结果是 true?

9
为什么在javascript中,{} == false的结果是false,而[] == false的结果是true

8
因为 JavaScript,可以在 Google 上搜索"wat" + JavaScript (Destroy All Software Talks)。 - BeyelerStudios
1
为了额外的娱乐:if([]) alert("wtf") - spender
1
== 喜欢将东西作为数字或字符串进行比较,因此 {}==="objectObject" 但 []=="" 作为一个字符串。 - dandavis
1个回答

7
这是根据抽象相等比较算法进行的类型转换:
{} == 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 顺便说一句,非常感谢您如此清晰的回答! :) - prateekj_ahead
1
这比那要复杂一些。ToPrimitive接受一个提示,应指示对象是否应转换为数字或字符串。如果未提供提示,则默认为日期对象的“string”和所有其他对象的“number”。在“number”的情况下,调用该对象的valueOf方法。但是如果该方法不返回原始值,则会回退到toString。默认情况下,valueOf仅返回对象本身,因此它不是原始值。 - Felix Kling
添加了一些对象如何转换为基本类型的示例。 - Felix Kling
完美!正是我想要的!非常感谢! - prateekj_ahead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接