哪些操作能导致类型转换呢

if 条件判断

为 false 的值 -> false undefined null 0 '' NaN

运算符操作

常见的运算符 + - * /
+ 比拟非凡除了相加之外 还有字符串拼接的含意

1)数字和非字符串相加

1 + null -> 0;// undefined 比拟非凡 示意未定义的,不是一个数字1 + undefined -> NaN// 会把空对象转换成数字,如果转换不成数字就变成字符串拼接1 + {} -> 1[object object]

2)非数字相加

// 把两边都转化成数字true + true -> 2// 如果有一方是字符串,则进行字符串拼接true + {} -> true[object object]

valueOf / toString

对象的原型链上有 valueOf 和 toString 两个办法

let obj = {  symbol[toPrimitive](){    return 500  },  valueOf(){    return 100  },  toString(){    return 200  }}// 两边都转换成数字 obj 先调用 valueOf valueOf 如果返回不是数字 则持续调用 toString 办法true + obj -> 101

symbol[toPrimitive] 是对象内置属性,当一个对象要转换成对应的原始类型时,会调用此办法。

总结下,当对象要进行类型转换时,会顺次调用 symbol[toPrimitive] valueOf toString 

+ 、- 、!

+ - 和 ! 一样,能够放在变量后面,进行疾速类型转换

1 + +'1234' -> 12351 + '1234'  -> '11234'

比拟元算 > = <

1)数字和数字间接比拟

2)字符串比拟

// 字符串和字符串,比拟的是 AscII 码console.log('a'.charCodeAt(0))console.log('b'.charCodeAt(0))'a' < 'b' -> true'a' < 'bdede' -> true // 一样的因为比的是第一位// 数字和字符串相比,字符串先转化成数字,如果转化不成数字 这比拟始终返回 false1 < '123' -> true1 < '1df' -> false// 如果是对象和字符串相比,须要把对象先转化成根本类型(字符串之后再比拟)[] == '' -> true// [].valueOf 为[],持续调用 [].toString 为 '',比拟返回 true

3) == 比拟

如果一方是数字,会先把另一方转换成数字 而后比拟

若果其中一方是 boolean 类型 会把 boolean 类型转换为数字

null == undefined // true

null、undefined 和任何类型相比 == 都返回 false

NaN 和任何类型相比返回 false 包含它自身

举例

console.log([] == ![]);// [] == false  单目运算优先级最高 为 false 的状况 false undefined NaN null 0 ''// [] == 0      [].valueOf()  -> [] 不是原始类型持续调用 toSting // [] == 0      [].toString() -> ''// '' == 0      Number('')//  0 == 0      true

(完)