首先我们要知道,在 JS 中类型转换只有三种情况,分别是:
我们先来看一个类型转换表格

在条件判断时,除了 undefined, null, false, NaN, ‘‘, 0, -0,其他所有值都转为 true,包括所有对象。
对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:
x.valueOf(),如果转换为基础类型,就返回转换的值x.toString(),如果转换为基础类型,就返回转换的值当然你也可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。
let a = { valueOf() { return 0 }, toString() { return ‘1‘ }, [Symbol.toPrimitive]() { return 2 } } 1 + a // => 3
加法运算符不同于其他几个运算符,它有以下几个特点:
1 + ‘1‘ // ‘11‘ true + true // 2 4 + [1,2,3] // "41,2,3"
1 转换为字符串,得到结果 ‘11‘true 转为数字 1toString 转为字符串 1,2,3,得到结果 41,2,3另外对于加法还需要注意这个表达式 ‘a‘ + + ‘b‘
‘a‘ + + ‘b‘ // -> "aNaN"
因为 + ‘b‘ 等于 NaN,所以结果为 "aNaN",你可能也会在一些代码中看到过 + ‘1‘ 的形式来快速获取 number 类型, + ‘ ‘ => 0 。
那么对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字
4 * ‘3‘ // 12 4 * [] // 0 4 * [1, 2] // NaN
toPrimitive 转换对象unicode 字符索引来比较let a = { valueOf() { return 0 }, toString() { return ‘1‘ } } a > -1 // true
在以上代码中,因为 a 是对象,所以会通过 valueOf 转换为原始类型再比较值。
原文:https://www.cnblogs.com/gwf93/p/10295234.html