类型转换
Javascript8大数据类型
- 7种原始类型: Undefined、Null、Boolean、String、Number、Symbol、Bigint。
- 1种引用类型:Object(普通对象、数组、函数等等)。
javascript隐式转换规则
TIP
这里主要讨论null、undefined、布尔型、字符串、数字、数组、普通对象的隐式类型转换。
ToBoolean
ToString
不是方法也不是对象,是指其他类型的值转换为Boolean类型的操作
。
INFO
除了下表中的6个值会被转成false,其他都会被转换成 true。
参数类型 | 0 | "" | NaN | Null | false | Undefined |
---|---|---|---|---|---|---|
转为Boolean类型 | false | false | false | false | false | false |
javascript
Boolean(0) // false
Boolean("") // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(false) // false
Boolean(undefined) // false
Boolean(0) // false
Boolean("") // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(false) // false
Boolean(undefined) // false
ToString
ToString
不是方法也不是对象,是指其他类型的值转换为String类型的操作
。
其它类型转为String类型
类型 | 转为String类型 |
---|---|
Null | null 转为"null" |
Undefined | undefined 转为"undefined" |
Boolean | true 转为 "true"、false 转为 "false" |
Number | 1 转为 "1"、1e21 转为 "1e+21" |
Array | [1,2,3] 转为 "1,2,3"、[ ] 转为 ""(空字符串)、数组中的null和undefined也转为""(空字符串) |
普通对象 | 普通对象 转为 "[object Object]" |
javascript
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(10) // '10'
String(1e21) // '1e+21'
String([1,2,3]) // '1,2,3'
String([]) // ''
String([null]) // ''
String([1, undefined, 3]) // '1,,3'
String({}) // '[object Objecr]'
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(10) // '10'
String(1e21) // '1e+21'
String([1,2,3]) // '1,2,3'
String([]) // ''
String([null]) // ''
String([1, undefined, 3]) // '1,,3'
String({}) // '[object Objecr]'
ToNumber
ToString
不是方法也不是对象,是指其他类型的值转换为Number类型的操作
。
其它类型转为Number类型
类型 | 转为Number类型 |
---|---|
Null | null 转为 0 |
Undefined | undefined 转为 NaN |
Boolean | true 转为1、false 转为 0 |
String | 如果是纯数字形式,则转为对应的数字,空字符转为0, 否则一律按转换失败处理,转为NaN |
Array | 执行ToPrimitive |
普通对象 | 执行ToPrimitive |
javascript
Number(null) // 0
Number(undefined) // NaN
Number('10') // 10
Number('10a') // NaN
Number('') // 0
Number(true) // 1
Number(false) // 0
Number([]) // 0
Number(['1']) // 1
Number({}) // NaN
Number(null) // 0
Number(undefined) // NaN
Number('10') // 10
Number('10a') // NaN
Number('') // 0
Number(true) // 1
Number(false) // 0
Number([]) // 0
Number(['1']) // 1
Number({}) // NaN
ToPrimitive
ToPrimitive
不是方法也不是对象,是指对象类型转换为原始类型的操作
。
ToPrimitive转换规则
ToPrimitive它遵循先valueOf后toString的模式期望得到一个原始类型。
- 对象转布尔: 所有的引用类型转布尔都为true。
- 对象转字符串:
- 判断obj是基本类型则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则报类型错误TypeError
- 对象转数字
- 判断obj是基本类型则返回
- 否则调用valueOf()方法,如果得到原始类型,则返回
- 否则调用toString()方法,如果得到原始类型,则返回
- 否则报类型错误TypeError
一元运算如(+ 、 - 、++ 、--)
INFO
- 对于布尔值:true 转换为 1,false 转换为 0。
- 对于 null:转换为 0。
- 对于 undefined:转换为 NaN。
- 对于字符串:尝试将字符串转换为数字,如果不能转换则为 NaN。
- 对于对象、数组等:执行ToPrimitive。
javascript
// 一元加号 (+)
+true; // 1
+false; // 0
+null; // 0
+undefined; // NaN
+"123"; // 123
+"abc"; // NaN
+{}; // NaN
+[]; // 0
+[1, 2, 3]; // NaN
// 一元加号 (+)
+true; // 1
+false; // 0
+null; // 0
+undefined; // NaN
+"123"; // 123
+"abc"; // NaN
+{}; // NaN
+[]; // 0
+[1, 2, 3]; // NaN
双目运行符(+)
具有数值相加和字符拼接的两种意义
INFO
转换优先级:从高到低
- 当一侧为String类型:
- 被识别为字符串拼接,并会优先将另一侧转换为String类型。
- 当一侧为Number类型:
- Number + Number:直接相加
- Number + 原始类型:将原始类型转为Number
- Number + 引用类型:引用类型执行ToPrimitive,在进行操作。
- 其他情况:
- 执行ToPrimitive,在进行操作。
javascript
注意:当 { } 在 运算符左侧时被解析为一个空的代码块const n = 1;
n + '1' // '11'
n + 1 // 2
null + 1 // 1
undefined + n // NaN
n + [] // '1'
[] + {} // [object Object]
{} + [] // ''
const n = 1;
n + '1' // '11'
n + 1 // 2
null + 1 // 1
undefined + n // NaN
n + [] // '1'
[] + {} // [object Object]
{} + [] // ''
双目==运算符
隐士类型转换规则
- 相同类型的原始值直接比较。
- NaN和其他任何类型比较永远返回false(包括和他自己)。
- null == undefined比较结果是true,并且也与其自身相等。和其他所有值都不相等
- Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型。
- String和Number比较,先将String转换为Number类型。
- 原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型。
javascript
NaN == NaN // false
null == undefined // true
null == 0 // false
null == false // false
undefined == 0 // false
undefined == false // false
true == ['1'] // true
1 == '1' // true
'[object Object]' == {} // true
'1,2,3' == [1,2,3] // true
NaN == NaN // false
null == undefined // true
null == 0 // false
null == false // false
undefined == 0 // false
undefined == false // false
true == ['1'] // true
1 == '1' // true
'[object Object]' == {} // true
'1,2,3' == [1,2,3] // true
双目关系操作符(>、<、>=、<=)
具有数字比较和字符串比较两种意义
隐士类型转化规则
- 一侧为Number类型,则转为Number类型比较。
- 一侧为Boolean类型,则转为Number类型比较。
- 两侧均为String时,则比较字符串的字符编码值。
- 其他情况执行ToPrimitive,再进行上面操作。