JavaScript深入之类型转换

JavaScript 是弱类型的语言,它的取值非常灵活。你期望一种类型值的时候,你可以提供任何类型的值,JavaScript 将根据需要自行转换类型,在 JavaScript 中通常将它们统称为 强制类型转换

ECMAScript 规范Type Conversion 章节中定义了转换规则。这里我们着重介绍 **ToPrimitiveToBoolean**、 ToNumberToString

ToPrimitive

在 JavaScript 中,想要将对象转换成原始值,必然会调用 toPrimitive()内部函数,那么它是如何工作的呢?

1
2
ToPrimitive(input [, PreferredType])
input 是输入的值,preferedType 是期望转换的类型,
输入类型 结果
Undefined 返回 input 自身
Null 返回 input 自身
Boolean 返回 input 自身
Number 返回 input 自身
String 返回 input 自身
Symbol 返回 input 自身
Object 返回该对象的默认值。具体过程请(通过内部操作 DefaultValue ,参见 ES5 规范 8.12.8 节)

如果 PreferredType 是 Number,执行顺序如下:

  1. 如果 input 为 primitive,返回。
  2. 否则,input 为 Object。调用 obj.valueOf()。如果结果是 primitive,返回。
  3. 否则,调用 obj.toString(). 如果结果是 primitive,返回。
  4. 如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误。
  5. 如果 PreferredType 是 String,步骤 2 跟 3 互换,如果 PreferredType 为空,Date 类型默认为 String,其他都是 Number。

ToBoolean

ToBoolean 运算符根据下表将其参数转换为布尔值类型的值:

输入类型 结果
Undefined false
Null false
Boolean 结果等于输入的参数(不转换)。
Number 如果参数是 +0, -0, 或 NaN,结果为 false ;否则结果为 true。
String 如果参数参数是空字符串(其长度为零),结果为 false,否则结果为 true。
Object true
Symbol true

ToNumber

ToNumber 运算符根据下表将其参数转换为数值类型的值:

输入类型 结果
Undefined NaN
Null +0
Boolean 如果参数是 true,结果为 1。如果参数是 false,此结果为 +0。
Number 直接返回。
String 参见下文的文法和注释。
Symbol TypeError
Object 执行下列步骤:
1. 设 primValue 为 ToPrimitive( 输入参数 , hint Number)。
2.返回 ToNumber(primValue)。

ToString

ToString 运算符根据下表将其参数转换为字符串类型的值:

输入类型 结果
Undefined “undefined”
Null “null”
Boolean 如果参数是 true,那么结果为 “true”。
如果参数是 false,那么结果为 “false”。
Number 详见7.1.12.1NumberToString
String 直接返回 。
Symbol TypeError
Object 执行下列步骤:
1、设 primValue 为 ToPrimitive( 输入参数 , hint String)。
2、返回 ToString(设 primValue 为 )。

参考资料

Type Conversion and Testing
Type Conversion