主题
隐式转换
转换规则
| 转换前类型 | 转换前值 | 转换后 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'] // trueString和Number比较,先将String转换为Number类型js123 == '123' // true '' == 0 // truenull == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为falsejsnull == 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,所以为truejs[] == ![] // true一道有意思的面试题
如何让:
a == 1 && a == 2 && a == 3jsconst a = { value:[3,2,1], valueOf: function () {return this.value.pop(); }, }- 转换为
