为什么JavaScript使用不同于减号的字符串和整数来评估加号?
一个例子:
console.log(1+"1");
console.log(1-"1");
第一行打印“11”,第二行打印0。
答案 0 :(得分:5)
+
运算符赋予字符串特定含义,但-
运算符不具有。+
运算符。因此,当您尝试使用-
运算符并且其中一个操作数是字符串时,JavaScript会将整数转换为字符串,然后执行连接而不是添加。但是,当您使用plt.triplot
运算符时,因为该运算符没有使用字符串定义的行为,JavaScript会将字符串转换为整数然后进行减法。
答案 1 :(得分:1)
因为加号隐含地将1转换为字符串
减号隐含地将“1”转换为int。
按要求
<强> TL;博士; ECMA 5规范指出,如果运算符的左侧或右侧是字符串,则返回串联的字符串结果。其中,减号运算符仅对数字进行操作,因此它会将两边转换为数字
11.6.1加法运算符(+)#ⓉⓇⒼ 加法运算符执行字符串连接或数字加法。
生产AdditiveExpression:AdditiveExpression + MultiplicativeExpression的计算方法如下:
让lref成为评估AdditiveExpression的结果。
让lval为GetValue(lref)。
让rref成为评估MultiplicativeExpression的结果。
让rval为GetValue(rref)。
让lprim为ToPrimitive(lval)。
让rprim为ToPrimitive(rval)。
如果Type(lprim)是String或Type(rprim)是String,那么 返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。参见下面的注释11.6.3。
注1:在步骤5和6中对ToPrimitive的调用中没有提供提示。除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可以通过其他方式处理缺少提示。
注2:步骤7与关系运算符(11.8.5)的比较算法的步骤3的不同之处在于,使用逻辑运算而不是逻辑运算。
11.6.2减法运算符( - )#Ⓣ 生产AdditiveExpression:AdditiveExpression - MultiplicativeExpression的计算方法如下:
让lref成为评估AdditiveExpression的结果。
让lval为GetValue(lref)。
让rref成为评估MultiplicativeExpression的结果。
让rval为GetValue(rref)。
让lnum为ToNumber(lval)。
让rnum为ToNumber(rval)。
将减法运算的结果返回到lnum和rnum。请参阅下面的注释11.6.3。