JavaScript是一门动态类型的语言,也就是说类型可以在任何时候进行转换,而转换方式可以分为强制和自动转换,或者叫做显式和隐式的转换。

1. 强制类型转换

强制转换主要指使用Number()、String()和Boolean()三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。

(1)数值型

使用Number()函数,可以将任意类型的值转化成数值,原始类型值的转换规则:

  • 数值:转换后还是原来的值
  • 字符串:如果可以被解析为数值,则转换为相应的数值
  • 字符串:如果不可以被解析为数值,返回 NaN
  • 空字符串转为0
  • 布尔值:true 转成 1,false 转成 0
  • undefined:转成 NaN
  • null:转成0

另外还有两点需要注意:

  • parseInt逐个解析字符,而Number函数整体转换字符串的类型,只要有一个字符无法转成数值,整个字符串就会被转为NaN
  • parseInt和Number函数都会自动过滤一个字符串前导和后缀的空格

另外还有Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组,其原理是:

  • 第一步,调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。

  • 第二步,如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。

  • 第三步,如果toString方法返回的是对象,就报错。

(2) 字符型

String函数可以将任意类型的值转化成字符串,转换规则如下:

  • 数值:转为相应的字符串。
  • 字符串:转换后还是原来的值。
  • 布尔值:true转为字符串"true",false转为字符串"false"。
  • undefined:转为字符串"undefined"。
  • null:转为字符串"null"

String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式,背后的原理如下:

  • 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  • 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  • 如果valueOf方法返回的是对象,就报错。

(3) 布尔型

Boolean函数可以将任意类型的值转为布尔值。

除了以下五个值的转换结果为false,其他的值全部为true。

  • undefined
  • null
  • -0或+0
  • NaN
  • ''(空字符串)

所有对象(包括空对象)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true。

2.自动转换

遇到以下三种情况时,JavaScript 会进行隐式类型转换:

  • 不同类型的数据互相运算。
  • 对非布尔值类型的数据求布尔值。
  • 对非数值类型的值使用一元运算符(即+和-)。

JavaScript 遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。

因此除了以下五个值,其他都是自动转为true。

  • undefined
  • null
  • +0或-0
  • NaN
  • ''(空字符串)

JavaScript 字符串的自动转换,主要发生在字符串的加法运算时。当一个值为字符串,另一个值为非字符串,则后者转为字符串。

除了加法运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。

3. 参考文章

阮一峰 - 数据类型的转换