为什么Javascript在int和string上运行时会有不同的加减值

时间:2017-03-14 17:01:20

标签: javascript

为什么JavaScript使用不同于减号的字符串和整数来评估加号?

一个例子:

console.log(1+"1");
console.log(1-"1");

第一行打印“11”,第二行打印0。

2 个答案:

答案 0 :(得分:5)

+运算符赋予字符串特定含义,但-运算符不具有。+运算符。因此,当您尝试使用-运算符并且其中一个操作数是字符串时,JavaScript会将整数转换为字符串,然后执行连接而不是添加。但是,当您使用plt.triplot运算符时,因为该运算符没有使用字符串定义的行为,JavaScript会将字符串转换为整数然后进行减法。

答案 1 :(得分:1)

因为加号隐含地将1转换为字符串

减号隐含地将“1”转换为int。

按要求

<强> TL;博士; ECMA 5规范指出,如果运算符的左侧或右侧是字符串,则返回串联的字符串结果。其中,减号运算符仅对数字进行操作,因此它会将两边转换为数字

http://es5.github.io/#x11.9.3

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。