阅读摘记:
1. Number与String进行比较时,将String类型转化为Number。
2. Boolean与任何类型进行比较时,将Boolean类型转化为Number。
3. null与undefined进行比较时,返回true。
4. Object与非Object进行比较时,将Object类型转化为基础类型
(调用valueOf,如果没有得到基础类型那么继续调用toString,直至得到基础类型中一项为止)
5.其余z并没有提到的并不发生转化(如有遗漏欢迎留言补全)
关于对象转化为基础值参考
为了转换为基本类型值的等价物,ToPrimitive 抽象操作(ES5 语言规范,9.1 部分)将会查询这个值(使用内部的 DefaultValue 操作 —— ES5 语言规范,8.12.8 部分),看它有没有 valueOf() 方法。如果 valueOf() 可用并且它返回一个基本类型值,那么 这个 值就将用于强制转换。如果不是这样,但 toString() 可用,那么就由它来提供用于强制转换的值。
如果这两种操作都没提供一个基本类型值,就会抛出一个 TypeError。 以下一个例子列表,摘抄于书,可以增加对上述规则的熟练度
"0" == null; // false
"0" == undefined; // false
"0" == false; // true --false转化为0(第2条规则),然后"0"被转化为0(第一条规则),返回true
"0" == NaN; // false
"0" == 0; // true
"0" == ""; // false
false == null; // false
false == undefined; // false
false == NaN; // false
false == 0; // true
false == ""; // true
false == []; // true
false == {}; // false
"" == null; // false
"" == undefined; // false
"" == NaN; // false
"" == 0; // true
"" == []; // true
"" == {}; // false
0 == null; // false
0 == undefined; // false
0 == NaN; // false
0 == []; // true
0 == {}; // false
算是复习,快过年了闲来无事重读You-Dont-Know-JS,相比一年之前的第一次粗读大不一样,果然书读百遍其义自见这话是有几分道理的。
ps:遇到一个小疑问,如果有大神能解答不胜感激
将a + ""这种 隐含的 强制转换与我们早先的String(a)明确的 强制转换的例子相比较,有一个另外的需要小心的奇怪之处。由于ToPrimitive抽象操作的工作方式,a + ""在值a上调用valueOf(),它的返回值再最终通过内部的ToString抽象操作转换为一个string。但是String(a)只直接调用toString()。
怎么验证在valueOf返回非基础类型的情况下toString是对valueOf的返回值进行加工,toString操作是怎么拿到vauleOf的返回值,或者我理解有误?ToString并不等同于toString...