JavaScript:为什么 % 运算符可以作用于字符串? - (类型强制转换)


假设我们有一段代码片段,它产生了一些令人惊讶的结果。首先,我们看到模运算符也可以很好地作用于字符串(令人惊讶)。其次,两个字符串的连接产生了奇怪的结果。

我们需要解释为什么 JavaScript 会这样做?

这是问题代码:

示例

const numStr = '127';
const result = numStr % 5;
const firstName = 'Armaan';
const lastName = 'Malik';
const fullName = firstName + + lastName;
console.log('modulo result: ', result);
console.log('full name: ', fullName);

输出

modulo result: 2
full name: ArmaanNaN

在深入研究代码之前,让我们先了解一下 JavaScript 最基本的概念之一:类型强制转换。

类型强制转换

基本上,类型强制转换是 JavaScript 编译器用来将一种数据类型更改为另一种数据类型的方法。有效的类型强制转换示例包括将字符串转换为布尔值、将数字转换为字符串等等。

类型强制转换是一个非常广泛的话题,为了限制本解决方案的长度,我们将仅探讨本代码片段中使用的内容。在两种类型的类型强制转换中,一种是由编译器自动执行的,称为隐式类型强制转换。

它遵循:

任何数据类型(原始类型或非原始类型)将隐式强制转换为:

  • 字符串(当与二元 + 运算符一起使用时)。

  • 数字(当与算术运算符(如 +、-、/、*、%)一起使用时,只有单目 + 会触发数字强制转换)。

数字强制转换(非二元 +),当与比较运算符、位运算符或松散相等运算符 [==] 一起使用时。

  • 布尔值(当与逻辑运算符 & | ! 一起使用时)。

***需要注意的是,单目 (+) 运算符的优先级高于二元 (+) 运算符。

代码解释

因此,在这些事情明确之后,让我们转到代码并逐行进行:

Line 2 → result = '127' % 5;

隐式强制转换接收并看到 % 运算符,因此它将字符串 '127' 转换为数字 127,并将 2 存储在结果中:

Line 5 → fullName = firstName + + lastName;
fullName = firstName + (+lastName);

通常情况下,计算将从左到右进行,但是由于单目运算符的优先级,它首先被计算为数字,并且操作变成这样:

fullName = firstName + NaN;

然后

fullName = ArmaanNaN

更新于:2020年8月18日

266 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告