【问题标题】: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" 而将 []=="" 作为字符串进行比较

标签: javascript boolean equality-operator


【解决方案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

参考:ToNumberToPrimitive

因此,更喜欢使用严格比较。


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 只是返回对象本身,所以它不是原始对象。
  • 添加了一些如何将对象转换为基元的示例。
  • 完美!正是我想要的!非常感谢!
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 2022-01-10
  • 2014-02-16
  • 2019-04-24
  • 2012-03-06
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多