本页面介绍了 JavaScript 的类型强制转换行为和运算符功能——这两个密切相关的概念经常出现在 JavaScript 面试题中。理解 JavaScript 如何隐式地在类型之间进行转换,以及不同运算符如何与这些转换交互,对于编写可预测的代码至关重要。
类型强制转换是指值从一种数据类型自动或隐式转换为另一种数据类型。JavaScript 以其广泛的类型强制转换应用而闻名,这既能带来便利,也可能导致困惑。
来源: README.md154-171 README.md468-512
在深入探讨强制转换之前,理解 JavaScript 的类型系统很重要。
JavaScript 有两大类数据类型
| 基本类型 | 对象类型 |
|---|---|
| 字符串 | 对象 |
| 数字 | 数组 |
| 布尔值 | 功能 |
| null | 日期 |
| 未定义 | RegExp |
| 符号 | Map/Set |
| BigInt | 等等。 |
当操作涉及不同数据类型时,JavaScript 会自动进行类型转换。
+ 运算符与字符串和另一种类型一起使用时+ 除外)与非数字一起使用时来源: README.md468-512 README.md1477-1500
在布尔上下文中,JavaScript 值被评估为真值或假值。
来源: README.md1086-1117 README.md1267-1293
当操作数具有不同类型时,JavaScript 中的算术运算符会触发类型强制转换。
| 运算符 | 示例 | 强制转换行为 |
|---|---|---|
+ | 1 + '2' | 如果任一操作数为字符串,则转换为字符串,否则进行数值加法 |
- | '5' - 2 | 将字符串转换为数字 |
* | '3' * 2 | 将字符串转换为数字 |
/ | '6' / 2 | 将字符串转换为数字 |
% | '5' % 2 | 将字符串转换为数字 |
来源: README.md468-512 README.md1477-1500
+ 进行字符串连接+ 运算符具有双重行为
一元运算符作用于单个操作数。
| 运算符 | 示例 | 效果 |
|---|---|---|
+ | +true | 转换为数字(1) |
- | -'3' | 转换为数字然后取反(-3) |
++ | number++ | 返回原值然后递增 |
++ | ++number | 递增然后返回新值 |
-- | number-- | 返回原值然后递减 |
-- | --number | 递减然后返回新值 |
! | !'text' | 转换为布尔值然后取反 |
!! | !!0 | 双重取反(实际上转换为布尔值) |
typeof | typeof value | 返回类型字符串 |
来源: README.md154-171 README.md516-550 README.md1267-1293
比较运算符可能会触发类型强制转换,具体取决于它们是否是严格比较。
| 运算符 | 类型强制转换 | 示例 | 结果 |
|---|---|---|---|
== | 是 | 1 == '1' | true (将字符串转换为数字) |
=== | 否 | 1 === '1' | false (不同类型) |
!= | 是 | 1 != '2' | true (将字符串转换为数字) |
!== | 否 | 1 !== '1' | true (不同类型) |
>, <, >=, <= | 是 | '2' > 1 | true (将字符串转换为数字) |
来源: README.md255-257 README.md607-614
当对象在期望原始值的操作中使用时,JavaScript 会尝试将它们转换为原始值。
来源: README.md861-885
typeof 运算符typeof 运算符返回一个字符串,指示操作数的类型。
| 表达式 | 结果 |
|---|---|
typeof 42 | "number" |
typeof "text" | "string" |
typeof true | "boolean" |
typeof undefined | "undefined" |
typeof {key: "value"} | "object" |
typeof null | "object" (历史遗留问题) |
typeof function(){} | "function" |
typeof [] | "object" |
typeof typeof 1 | "string" (因为 typeof 1 返回字符串 "number") |
来源: README.md1125-1144 README.md619-635
表达式从左到右求值。首先计算 3 + 4,结果为 7。然后 7 + '5' 强制进行字符串转换,结果为 "75"。
在此示例中,parseInt 将 '7' 解析为 7,并在遇到 '*' 时停止,因为它不是一个有效的数字,因此结果为 7。
! 运算符首先将值转换为布尔值,然后取反。第二个 ! 再次取反,有效地将原始值转换为其布尔等效值。
比较对象时,相等性比较检查的是引用,而非内容。
来源: README.md607-614
=== 和 !==)以避免意外的类型强制转换Number()、String() 或 Boolean() 构造函数typeof 或 instanceof+ 运算符来源: README.md607-614 README.md1086-1117
当使用 new Number() 等函数构造函数时,请注意它们创建的是对象包装器,而非原始值。
来源: README.md233-257
通过理解这些概念,您将能更好地处理 JavaScript 的类型强制转换系统,并编写更可预测的代码。