哪些操作能导致类型转换呢
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' -> 1235
1 + '1234' -> '11234'
比较元算 > = <
1)数字和数字直接比较
2)字符串比较
// 字符串和字符串,比较的是 AscII 码
console.log('a'.charCodeAt(0))
console.log('b'.charCodeAt(0))
'a' < 'b' -> true
'a' < 'bdede' -> true // 一样的因为比的是第一位
// 数字和字符串相比,字符串先转化成数字,如果转化不成数字 这比较始终返回 false
1 < '123' -> true
1 < '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
(完)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。