首先,在JS中类型转换只有三种情况,分别是:
- 转为布尔值
- 转为数字
- 转为字符串
先来看一个类型转换表格,然后再进入正题
1、转Boolean
在条件判断时,除了 undefuned、null、false、NaN、' ' 、0 、-0 ,其它所有的值都转为true,包括所有对象
2、对象转原始类型
对象在转换类型的时候,会调用内置的[[ToPrimitive]]函数,对于函数来说,算法逻辑一般来说如下:
- 如果已经是全是类型了,就不需要转换了
- 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
- 调用 x.toString(),如果转换为基础类型,就返回转换的值
- 如果没有返回原始类型,就会报错
当然也可以重写 Symbol.toPrimitive,该方法在转原始类型时调用优先级最高
let a = {
valueOf() {
return 0;
},
toString() {
return '1';
},
[Symbol.toPrimitive]() {
return 2
};
};
1 + a // => 3
3、四则运算符
加法运算符不同于其它几个运算符,它有以下几个特点:
-
运算其中一方为字符串,那么就把另一方也转换为字符串
-
如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
1 + '1' // '11' true + true // 2 4 + [1,2,3] // "41,2,3"
// 对于第一行代码来说,触发特点一,所以将数字1转换为字符串,得到结果'11' // 对于第二行代码来说,触发特点二,所以将true转换为数字1 // 对于第三行代码来说,触发特点二,所以将数组通过toString转为字符串1,2,3,得到结果41,2,3
另外对于加法还需要注意个表达式
'a' + + 'b' // -> "aNaN"
// 因为 + 'b' 等于 NaN ,所以结果为"aNaN",有时候可以通过 + '1' 的形式来快速获取number类型。
那么对于除了加法的运算符来说,只要其中一方是数字,另一方就会转为数字
4 * '3' // 12
4 * [] // 0
4 * [1,2] // NaN
4、比较运算符
-
如果是对象,就通过 toPrimitive 转换对象
-
如果是字符串,就通过 unicode 字符所以来比较
let a = { valueOf() { return 0; }, toString() { return '1'; } };
a > -1 // true
// 因为a是对象,所以通过valueOf转换为原始类型再比较值。
---END---