2

if([] == false){console.log('a')}
if({} == false){console.log('b')}
if([] == {}){console.log('c')}
if([]){console.log('d')}

这几道题的隐式转换的方式大神帮忙解答下吧

Hurry_9 82
2018-12-23 提问

查看全部 3 个回答

5

已采纳

对象和非对象之间的相等比较

ES5 规范 11.9.3.8-9 做如下规定:

如果 Type(x) 是字符串或数字, Type(y) 是对象,则返回 x == ToPrimitive(y) 的结果;
如果 Type(x) 是对象, Type(y) 是字符串或数字,则返回 ToPromitive(x) == y 的结果。

ToPrimitive就是尝试返回它的原始值,也就是string或者number

因此:

  1. [] == false,[]会先通过valueOf,得到[],不是原始值,再通过toString,得到""
  2. ({}) == false,同上面步骤,最终的到"[object Object]"
  3. 同上,''!="[object Object]"
  4. 没有==,[]默认为true

参考:《你不知道的JS(中)》,强烈建议看看,另外给出一个很坑的[]==![],返回true

推广链接