假值
- undefined
- null
- false
- +0、-0、NaN
- “”
空数组、空对象、空函数、包装了假值的对象,都是真值
1.字符串和数字之间的相等比较
字符串转为数字,再比较
2.其他类型和布尔类型之间的相等比较
布尔类型转成0或1,再比较
var x = true;
var y = "42";
x == y; // false
Type(x) 是布尔值,所以 ToNumber(x) 将 true 强制类型转换为 1,变成 1 == "42",二者的
类型仍然不同,"42" 根据规则被强制类型转换为 42,最后变成 1 == 42,结果为 false。
3.null == undefined
4.对象和非对象之间的相等比较
对象拆封
var a = 42;
var b = [ 42 ];
a == b; // true
[]会被强制类型转换为""
{} 会被强制类型转换为 “[object Object]”
5.假值的相等比较
在比较之前牢记上面四种情况
- 字符串转数字
- 布尔值转0/1
- null == undefined
- 对象拆封
false == "" // true
1.布尔值转0,成为0==""
2.字符串转数字,成为0==0
0 == [] //true
试着自己分析一下?
[]会被强制类型转换为"",0 == ""
[] + {} VS {}+[]
[] + {}; // "[object Object]"
{} + []; // 0
1. {} 出现在 + 运算符表达式中,因此它被当作一个值(空对象)来处理。 [] 会被强制类型转换为 "",而 {} 会被强制类型转换为 "[object Object]"
2. {} 被当作一个独立的空代码块(不执行任何操作)。代码块结尾不需要分号,所以这里不存在语法上的问题。最后 +[] 将 [] 显式强制类型转换为 0