主题
数据类型转换
数据类型
最新的 ECMAScript 标准定义了 8 种数据类型:
- 七种原始数据类型:
- Boolean
- Number
- BigInt
- String
- Symbol
- undefined
- null
- 以及对象(Object)
typeof operand 的返回值
- typeof null,返回 'object',typeof 其他原始数据类型,返回对应的类型。
- typeof Function 对象,返回 'function',typeof 其他对象,返回 'object'。
类型转换
显式类型转换
- Boolean 函数
0、-0、NaN、0n、''、undefined、null 转为 false,其他转为 true。 - Number 函数
- Number(原始数据类型)
- Boolean:true 转为 1,false 转为 0。
- BigInt:转为数值,可能会丢失精度。
- String:如果可以被解析为数值则转换为相应的数值,否则得到 NaN。空字符串转为 0。
- Symbol:报错,TypeError。
- undefined:转为 NaN。
- null:转为 0。
- Number(对象)
调用对象的 Symbol.toPrimitive 方法,参数为 'number'。此时先调用对象自身的 valueOf 方法,如果返回值为原始类型,对该值使用 Number 方法获得转换结果,如果返回值为对象,再调用对象自身的 toString 方法,如果返回值为原始类型,对该值使用 Number 方法获得转换结果,否则报错。
- Number(原始数据类型)
- BigInt 函数
- BigInt(原始数据类型)
除了布尔值、整数、可以被解析为大整数的字符串,其他值无法转为大整数。 - BigInt(对象)
转换逻辑与 Number(对象) 类似。
- BigInt(原始数据类型)
- String 函数
- String(原始数据类型)
转为相应的字符串(大整数转为字符串后不带 n)。 - String(对象)
调用对象的 Symbol.toPrimitive 方法,参数为 'string'。此时先调用对象自身的 toString 方法,如果返回值为原始类型,对该值使用 String 方法获得转换结果,如果返回值为对象,再调用对象自身的 valueOf 方法,如果返回值为原始类型,对该值使用 String 方法获得转换结果,否则报错。
- String(原始数据类型)
- Symbol 函数
Symbol(undefined) 转为 Symbol(),其他值先转为字符串,再转为相应的符号。
隐式类型转换
- 运算
- 逻辑运算、条件(三元)运算:左操作数将转为布尔值。
- 算术运算、位运算:操作数将转为数值。
- 字符串运算:操作数将转为字符串。
- 比较运算
- ==、!=:转换逻辑与加号类似,详见下面对加号的解释。
- >、>=、<、<=:操作数将转为数值。
- in:左操作数非符号类型时,将转为字符串。
- 条件判断语句
条件表达式的结果将转为布尔值。 - 某些内置方法
比如alert()、parseFloat()要求参数是字符串,如果不是会将其转换为字符串。
如何区分加号做字符串运算还是做算术运算?
操作数都是原始类型的情况下,如果有操作数是字符串就做字符串运算,否则就做算术运算。当操作数中存在对象时,调用对象的 Symbol.toPrimitive 方法,参数为 'defalut'。此时先调用对象自身的 valueOf 方法,如果返回值为原始类型就用该值进行运算,如果返回值为对象,再调用对象自身的 toString 方法,如果返回值为原始类型就用该值进行运算,否则报错,TypeError。