使用node.js控制台,我得到以下意外结果:
> 2 + "3"
"23"
> 2 * "3"
6
为什么第一个例子在第二个例子中支持字符串连接和整数乘法?我不希望不同类型之间的连接,而是抛出错误。如果这是JS中的行为,我该如何预测最终结果的类型?
答案 0 :(得分:3)
在JavaScript中,+
运算符用作加法和连接(将两个字符串连接在一起),并且当两个值中的一个是字符串时将默认为连接。
由于您在整数和字符串之间使用它,它将默认为concatentation。如果您需要强制执行添加操作,则需要确保所有值都是数字。您可以使用parseInt()
和parseFloat()
函数执行此操作。
2 + parseInt("3"); // 5
*
运算符仅用于乘法,因此它会自动将字符串转换为数字以执行操作。
鉴于上述情况,您可以使用另一种技巧强制字符串数字实际成为数字,将它们乘以1 *1
。
2 + "3"*1; // 5
答案 1 :(得分:2)
根据ECMAScript 2015语言规范(Addition operator,Multiplicative operators),加法表达式的评估是(lprim
是左基元(lval转换为基元),{{1}是正确的一个):
rprim
乘法表达式的评估是:
...
If Type(lprim) is String or Type(rprim) is String, then
Let lstr be ToString(lprim).
ReturnIfAbrupt(lstr).
Let rstr be ToString(rprim).
ReturnIfAbrupt(rstr).
Return the String that is the result of concatenating lstr and rstr.
Let lnum be ToNumber(lprim).
ReturnIfAbrupt(lnum).
Let rnum be ToNumber(rprim).
ReturnIfAbrupt(rnum).
Return the result of applying the addition operation to lnum and rnum.
你可以看到,如果它是一个加法表达式,首先检查是否有一个字符串。如果存在String,则执行字符串连接。否则,将值转换为Number并执行添加操作。
如果它是一个乘法表达式,它总是将值转换为Number并传递乘法运算。