主题
隐式转换
转换规则
转换前类型 | 转换前值 | 转换后 Boolean | 转换后 Number | 转换后 String |
---|---|---|---|---|
Boolean | true | - | 1 | "true" |
Boolean | false | - | 0 | "false" |
Number | 123 | true | - | "123" |
Number | Infinity | true | - | "Infinity" |
Number | 0 | false | - | "0" |
Number | NaN | false | - | "NaN" |
String | "" | false | 0 | - |
String | "123" | true | 123 | |
String | "123musi" | true | NaN | |
String | "Musi" | true, | NaN | |
Symbol | Symbol() | true | TypeError | TypeError |
Null | null | false | 0 | "null" |
Undefined | undefined | false | 0 | "undefined" |
Function | function(){} | true | NaN | "function(){}" |
Object | {} | true | NaN | "[object Object]" |
Array | [] | true | 0 | "" |
Array | [123] | true | NaN | "1,2,3" |
Array | [123, "musi"] | true | NaN | "123,musi" |
if语句和逻辑语句
如果只有单个变量,会先将变量转换为Boolean
值
数学运算符
除
+
号外的数学运算符,会先把非Number
类型的转换为Number
类型当数学运算符是
+
- 当有一侧是
String
类型,会先将另一侧转换为String
类型,然后进行字符串拼接 - 当一侧为
Number
类型,另一侧为原始类型,则把原始类型转换为Number
类型 - 当一侧为
Number
类型,另一侧为原始类型,则把两侧都转为String
类型,后进行字符串拼接
- 当有一侧是
==
NaN
和任何类型比较都为false
,包括他自己Boolean
和其他任何类型比较,Boolean
首先被转换为Number
类型jstrue == 1 // true true == '2' // false true == ['1'] // true
String
和Number
比较,先将String
转换为Number
类型js123 == '123' // true '' == 0 // true
null == undefined
比较结果是true
,除此之外,null
、undefined
和其他任何结果的比较值都为false
jsnull == undefined // true null == '' // false undefined == false // false
当原始类型和引用类型做比较时,对象类型会依照
ToPrimitive
规则转换为原始类型- 转换为
Number
,则先调用valueOf
,再调用toString
- 转换为
String
类型,先调用toString
,再调用valueOf
js'[object Object]' == {} // true '1,2,3' == [1, 2, 3] // true
!
优先级高,先把![]
转换为false
,false
为Boolean
类型,转换为Number
,为0
,则[]
调用valueOf
转换为0
,所以为true
js[] == ![] // true
一道有意思的面试题
如何让:
a == 1 && a == 2 && a == 3
jsconst a = { value:[3,2,1], valueOf: function () {return this.value.pop(); }, }
- 转换为