大多数情况,运算符和函数会自动把一个值转换成正确的类型。这称为“类型转换”。

例如,alert 函数自动将值转换为字符串展示。算术运算符则自动将值转换为数值。

当然也有需要我们显式将一个值转换成期待类型的场景。

⚠️暂时不讨论对象

在这一章中,我们还没有涉及到对象,先学习原始值。稍后在我们学习对象之后,会在《对象到原始值转换》一章学习对象的转换规则。

转换为字符串

字符串转换发生在期待字符串值的场景。

例如,alert(value) 就会将值转换成字符串形式后展示。

我们也可以通过调用 String(value) 函数来实现这个目的:

  1. let value = true;
  2. alert(typeof value); // boolean
  3. value = String(value); // 现在值变为字符串 "true"
  4. alert(typeof value); // string

字符串转换规则非常明显。false 变成 "false"null 变成 "null" 等。

转换为数值

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

例如,当 / 在非数字值上使用时:

  1. alert( "6" / "2" ); // 3, 字符串被转为数值

我们可以使用 Number(value) 函数将参数显式转换成数值:

  1. let str = "123";
  2. alert(typeof str); // string
  3. let num = Number(str); // 变成数值 123
  4. alert(typeof num); // number


当我们从基于字符串的源中(如文本输入框)读取内容的时候,希望当做数值处理,通常就需要显式转换。

  1. let age = Number("an arbitrary string instead of a number");
  2. alert(age); // NaN。转换失败

数值转换规则如下:

转换为……
undefined NaN
null 0
truefalse 10
字符串 首先去除首尾的空白字符,如果保留下来的是一个空字符串,那么结果就为 0;否则,从字符串中读取数值,读取无效返回 NaN

例子:

  1. alert( Number(" 123 ") ); // 123
  2. alert( Number("123z") ); // NaN 由于“z”的存在,无法将字符串转换为有效的数值
  3. alert( Number(true) ); // 1
  4. alert( Number(false) ); // 0

需要注意的是,nullundefined 在这里表现不一致:null 变成 0,而 undefiend 变成 NaN

转换为布尔值

布尔值转换是最简单的了。

发生在逻辑操作中(稍后我们将遇到条件检查和其他类似的检查),但也可以调用 Boolean(value) 函数执行转换。

转换规则:

  • 直觉上是“空”的值,像 0,空字符串,nullundefiendNaN 都变成 false
  • 其他值都是 true

例如:

  1. alert( Boolean(1) ); // true
  2. alert( Boolean(0) ); // false
  3. alert( Boolean("hello") ); // true
  4. alert( Boolean("") ); // false

⚠️请注意:字符串 "0" 也是 true

一些语言(比如 PHP)会把 "0" 看作 false。但在 JavaScript 中,任何非空的字符串都是 true

  1. alert( Boolean("0") ); // true
  2. alert( Boolean(" ") ); // 空格也是 true(所以非空字符串都是)

总结

有三种最广泛使用的类型转换:字符串、数字和布尔值。

转换成字符串:当我们需要展示某个值,或者用 String(value) 函数操作某个值的时候,会发生到字符串值的转换。通常来说,原始值到字符串的转换是显而易见的。

转换成数值:发生在算术运算中,或者用 Number(value) 函数操作的时候。

到数值的转换规则如下:

转换成……
undefiend NaN
null 0
true/false 1 / 0
字符串 首先去除首尾的空白字符,如果保留下来的是一个空字符串,那么结果就是 0;否则,从字符串中读取数值,读取无效返回 NaN

转换为布尔值:发生在逻辑运算中,或者用 Boolean(value) 函数操作的时候。

到布尔值的转换规则如下:

转换成……
0nullundefinedNaN"" false
其他值 true

这些规则中的大多数都很容易理解和记忆。容易犯错的地方是:

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

在我们学习了更多关于 JavaScript 的基本知识之后,会在《对象到原始值转换》一章中介绍对象的转换规则。

(完)


📄 文档信息

🕘 更新时间:2021/09/23
🔗 原文链接:https://javascript.info/type-conversions
🤟 特别感谢:@tys1998(tys1998)