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
广告