为什么 {} == false 评估为 false 而 [] == false 评估为 true?
Why does {} == false evaluate to false while [] == false evaluates to true?
为什么在 javascript 中 {} == false
的计算结果为 false
而 [] == false
的计算结果为 true
?
这是根据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
方法,然后 toString
如果 valueOf
不是 return 原始值。对于 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
为什么在 javascript 中 {} == false
的计算结果为 false
而 [] == false
的计算结果为 true
?
这是根据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
方法,然后 toString
如果 valueOf
不是 return 原始值。对于 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