JavaScript 类型转换

翻译、演绎自:javascript.info/type-conversions

多数时间,运算符和函数会自动将一个值转换到正确的类型,这称为“类型转换”。

例如:alert 会自动将任何类型的值转化为字符串显示,数学运算符则将值转换为数字。

ECMAScript 内部定义了一些“抽象操作”,定义了各种值类型的转换规则,包括:ToNumberToBooleanToStringToPrimitive

ToNumberToBooleanToString 是针对一种基本类型值转换为另一种基本类型值,定义的转换规则;ToPrimitive 是针对对象类型转换为一种基本类型值,定义的转换规则,而且在必要时从对象类型值转换出来的基本类型值还要在进行一次转换到另一个基本类型值的换算。

这节内容并不介绍对象类型转换(即 ToPrimitive),而是介绍基本类型值的转换规则。关于对象类型转换,在 《将对象转换为基本类型值》 一文介绍。

ToString

当一次运算的期望值是字符串的时候,就会发生 ToString 转换。

例如:用 alert(value) 显示的 value,最终就会转换为字符串显示。

当然,我们也可以调用 String(value) 函数显式将 value 转换为字符串。

let value = true;
alert(typeof value); // boolean

value = String(value); // 现在 value 的值是字符串 "true"
alert(typeof value); // string

ToString 的转化规则比较符合直觉:

转换为……
null “null”
undefined “undefined”
true 和 false “true” 和 “false”
Symbol() 和 Symbol(‘foo’) “Symbol()” 和 “Symbol(foo)”
数字 转换为对应的字符串形式。例如:0 转换为 “0”

ToNumber

数字转换会自动发生于数学函数和表达式中。

例如:除号 / 两边的非数字类型值就会自动转换为数字。

console.log('6' / '2'); // 3
console.log(typeof ('6' / '2')); // number

除了 /-*% 运算都会将操作数自动转换为数字。

当然,如果字符串不是一个可以有效转为数字的值,结果就是 NaN

let age = Number('an arbitrary string instead of a number');
console.log(age); // NaN

总结一下数字转换规则:

转换为……
null 0
undefined NaN
true 和 false 1 和 0
Symbol值 NaN
字符串 首先去除字符串两边的空格。如果剩下的是空字符串,结果就是 0;如果字符串是一个可以有效转为数字的值,就转为对应数字,否则结果就是 NaN

例子:

console.log(Number(' 123 ')); // 123
console.log(Number('123z')); // NaN
console.log(true); // 1
console.log(false); // 0

+ 运算符

几乎所有的数学运算符都会将操作数转换为数字进行运算。

+ 运算符有一些例外:如果 + 运算符的一边是字符串,那么另一边的值也会自动转换为字符串再相加。

console.log(1 + '2'); // "12"
console.log('1' + 2); // "12"

当然,这种情况只发生在操作数之一是字符串;如果两边都是非字符串的情况,那么就都转换为数字,然后进行加法运算。

ToBoolean

布尔值转换是最简单的了,它发生在逻辑运算中:

  • if(..)
  • for(..;..;..)
  • while(..) 和 do..while(..)
  • ?:
  • || 和 &&

但是也可以通过手动调用 Boolean(value) 实现。

转换规则如下:

转换为……
null, undefined, 0, NaN, ‘’, false false
其它值 true

例如:

console.log(Boolean(1)); // true
console.log(Boolean(0)); // false

console.log(Boolean('Hello')); // true
console.log(Boolean('')); // false

需要注意的是:"0" 会转换为 true

一些编程语言(比如 PHP)会把 "0" 作为 false 对待。但在 JavaScript 中,所有非空字符串都是 true

console.log(Boolean('0')); // true
console.log(Boolean(' ')); // true

总结

这里有 3 个最为常用的类型转换:ToStringToNumberToBoolean

ToString:当做输出操作(如 alert),或显式调用 String(value) 发生。基本类型值转换为字符串是比较符合直觉的。

转换规则如下:

转换为……
null “null”
undefined “undefined”
true 和 false “true” 和 “false”
Symbol() 和 Symbol(‘foo’) “Symbol()” 和 “Symbol(foo)”
数字 转换为对应的字符串形式。例如:0 转换为 “0”

ToNumber:发生数学运算,或者显式调用 String(value) 的情况。

转换规则如下:

转换为……
null 0
undefined NaN
true 和 false 1 和 0
Symbol值 NaN
字符串 首先去除字符串两边的空格。如果剩下的是空字符串,结果就是 0;如果字符串是一个可以有效转为数字的值,就转为对应数字,否则结果就是 NaN

ToBoolean:转换规则是最简单的,它发生在逻辑运算,或者显式调用 Boolean(value) 的地方。

遵循以下规则:

转换为……
null, undefined, 0, NaN, ‘’, false false
其它值 true

大多数的规则都是容易理解和记忆的。最经常记错是这两个点:

  • undefined 转换为数字结果是 NaN,而不是 0
  • "0" 和仅包含空格的字符串(像 " ")转换为布尔值的结果都是 true,而不是 false

对象转换在这里没有提及,会在下一篇 《将对象转换为基本类型值》 中介绍。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!