[0] == true; // false
[] == ![]; // true
相等操作符会有一个隐形的转换,这个隐形的转化会导致结果很"奇怪"。下面是隐形转换的基本规则:
- 其中一个值是boolean值:两个值都转为数字,false转为0,true转为1
- 其中一个值是字符串,另一个是数字:都转为数字再对比
- 其中一个是对象,另一个不是对象:调用对象的valueof方法,得到基本类型
- 其中一个是对象,另一个也是对象:对比对象指向的内存地址是否相等
- 其中一个是null,另一个是undefined:结果为true
- NaN与任何类型(包括本身NaN)都不相等
- 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。