[0] == true; // false
[] == ![];   // true

相等操作符会有一个隐形的转换,这个隐形的转化会导致结果很"奇怪"。下面是隐形转换的基本规则:

  1. 其中一个值是boolean值:两个值都转为数字,false转为0,true转为1
  2. 其中一个值是字符串,另一个是数字:都转为数字再对比
  3. 其中一个是对象,另一个不是对象:调用对象的valueof方法,得到基本类型
  4. 其中一个是对象,另一个也是对象:对比对象指向的内存地址是否相等
  5. 其中一个是null,另一个是undefined:结果为true
  6. NaN与任何类型(包括本身NaN)都不相等
  7. null,undefined在进行比较的时候,不进行数据类型转换

输出结果分析

[0] == true;

// 最终的对比形式
Number([0]) == Number(true);
[] == ![];

// !的运算级别比 '==' 高,先进行以下转换
[] == false;

// 再转化为最终的对比形式
Number([]) == Number(false);

'奇怪'的结果

undefined == 0;    // false

null == 0;    //false

false == 0;    //true

true == 1;    //true

true == 2;    //false

[] == [];    //false

圈圈
131 声望3 粉丝

下一篇 »
iterm 配置