Skip to content

类型转换

Javascript8大数据类型

  • 7种原始类型: Undefined、Null、Boolean、String、Number、Symbol、Bigint。
  • 1种引用类型:Object(普通对象、数组、函数等等)。

javascript隐式转换规则

TIP

这里主要讨论null、undefined、布尔型、字符串、数字、数组、普通对象的隐式类型转换。

ToBoolean

ToString不是方法也不是对象,是指其他类型的值转换为Boolean类型的操作

INFO

除了下表中的6个值会被转成false,其他都会被转换成 true。

参数类型0""NaNNullfalseUndefined
转为Boolean类型falsefalsefalsefalsefalsefalse
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类型
Nullnull 转为"null"
Undefinedundefined 转为"undefined"
Booleantrue 转为 "true"、false 转为 "false"
Number1 转为 "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类型
Nullnull 转为 0
Undefinedundefined 转为 NaN
Booleantrue 转为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的模式期望得到一个原始类型。

  1. 对象转布尔: 所有的引用类型转布尔都为true。

  1. 对象转字符串
    • 判断obj是基本类型则返回
    • 否则调用toString()方法,如果得到原始类型,则返回
    • 否则调用valueOf()方法,如果得到原始类型,则返回
    • 否则报类型错误TypeError

  1. 对象转数字
    • 判断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

转换优先级:从高到低

  1. 当一侧为String类型:
    • 被识别为字符串拼接,并会优先将另一侧转换为String类型。
  2. 当一侧为Number类型:
    • Number + Number:直接相加
    • Number + 原始类型:将原始类型转为Number
    • Number + 引用类型:引用类型执行ToPrimitive,在进行操作。
  3. 其他情况:
    • 执行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,再进行上面操作。