假设我们这里有一个代码片段,可产生一些惊人的结果。首先,我们看到模运算符也可以很好地处理字符串(令人惊讶)。其次,两个字符串的连接产生尴尬的结果。
我们需要解释为什么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的最基本主题→Type Coercion。
基本上,类型强制是JavaScript编译器用来将一种数据类型更改为另一种数据类型的方法。有效类型强制的示例包括将string更改为boolean,将number更改为string等。
类型强制是一个非常广泛的主题,为限制此解决方案的长度,我们将仅探讨此代码段中使用的内容。在两种类型的类型强制中,由编译器自动完成的一种称为隐式类型强制。
它遵循-
任何数据类型(原始或非原始)都将隐式强制为-
字符串(与二进制+运算符一起使用时)。
数字(当与算术运算符(如+,-,/,*,%和仅一元+触发器一起使用时)
与比较运算符,按位运算符或宽松等式运算符[==]一起使用时,数字强制不是二进制+
布尔值(与逻辑运算符&|!一起使用时)
***要注意的另一件事是,一元(+)运算符的优先级高于二元(+)运算符。
因此,在清除这些内容之后,让我们转到代码,逐行进行检查-
Line 2 → result = '127' % 5;
隐式强制输入并看到%运算符,因此它会将字符串'127'转换为数字127,并且2存储在结果中-
Line 5 → fullName = firstName + + lastName;
fullName = firstName + (+lastName);
在正常情况下,本来可以从左到右进行计算,但是由于一元运算符的优先级,它首先被计算为Number,并且运算变得像这样
fullName = firstName + NaN;
然后
fullName = ArmaanNaN