讲解各个类型组合的抽象相等,以及它们进行强制类型转换的方式
- 字符串和数字之间的相等比较
var a = 42;
var b = '42';
a === b: // false
a == b; // true
== 操作,a 或者b 进行了强制类型, 具体如何转换, 是a转换为字符串还是b转换为数字?
ES5规范11.9.3.4-5这样定义: (1)如果Type(x)为数字,Type(y)为字符串, 则返回x == ToNumber(y)的结果 (2)如果Type(x)为字符串,Type(y)为数组, 则返回x == ToNumber(y)的结果
- 其他类型和布尔类型之间的相等比较 ==最容易出错的一个地方是true和false与其他类型之间的相等比较。
var a = '42';
var b = true;
a == b; //false
"42"是一个真值,为什么==的结果不是true呢? 规范11.9.3.6-7定义: (1) 如果Type(x)是布尔类型,则返回ToNumber(x) == y的结果; (2) 如果Type(y)是布尔类型,则返回x == ToNumber(y)的结果。 分析上面的例子, Type(b)为布尔类型,强制转为ToNumber(true)为1, 则返回 ‘42’ == 1 为false。
- "42" == true中并没有发生布尔值的比较和强制类型转换。这里不是"42"转换为布尔值(true),而是true转换为1, "42"转换为42。 建议无论什么情况下都不要使用== true和== false 这样的方式更好if(!!a){} 或者这样 if(Boolean(a)){}
- null 和 undefined之间的相等比较 ES5规范11.9.3.2-3规定: (1) 如果x为null, y为undefined,则结果为true。 (2) 如果x为undefined, y为null,则结果为true。 在==中null和undefined是一回事,可以相互进行隐式强制类型转换\
var a = null;
var b;
a == b; // true
a == null; // true
b == null; //true
a == false; //false
b == false; //false
a == "" //false
a == 0; //false
- 其他情况 假值的相等比较
“0” == false; // true
"0" == undefined; // false
"0" == ''; //false
false == null; // false
false == undefined; // false
false == 0; // true
false == "" // true
false == []; // true
false == {}; //false
0 == null; // false
0 == undefined; //false
0 == []; //true
0 == {}; // false
0 == '\n'; // true
学习自《你不知道的js》