JavaScript 类型转换
多数时间,运算符和函数会自动将一个值转换到正确的类型,这称为 “类型转换”。
例如:alert
会自动将任何类型的值转化为字符串显示,数学运算符则将值转换为数字。
ECMAScript 内部定义了一些 “抽象操作”,定义了各种值类型的转换规则,包括:ToNumber
、ToBoolean
、ToString
和 ToPrimitive
。
ToNumber
、ToBoolean
和 ToString
是针对一种基本类型值转换为另一种基本类型值,定义的转换规则;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 个最为常用的类型转换:ToString
、ToNumber
和 ToBoolean
。
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 协议》,转载必须注明作者和本文链接
推荐文章: