2017-03-14 33 views

回答

1

由于加号隐含转换1为字符串

并隐式减号将“1”转换为int。

每请求

TL;博士; ECMA 5规范指出,如果运算符的左侧或右侧是一个字符串,则返回concatenating的字符串结果。凡为减号来的电话号码,只是工作,以便就双方转换为数字

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

11.6.1加法运算符(+)#ⓉⓇⒼ 加法运算或者执行字符串连接或数字加成。

生产AdditiveExpression:

令LREF是评估AdditiveExpression的结果:AdditiveExpression + MultiplicativeExpression如下评价。

让lval成为GetValue(lref)。

让rref是评估MultiplicativeExpression的结果。

设rval为GetValue(rref)。

让lprim ToPrimitive(lval)。

设rprim为ToPrimitive(rval)。

如果Type(lprim)是字符串或类型(rprim)的字符串,然后 返回字符串即串联接着的ToString(rprim)的ToString(lprim)

返回应用的结果的结果ToNumber(lprim)和ToNumber(rprim)的附加操作。请参阅下面的注释11.6.3。

注1:在步骤5和6中调用ToPrimitive时不提供任何提示。除Date对象外,除Date对象外的所有本机ECMAScript对象都处理缺少提示,就像提供了提示Number;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可能会以其他方式处理缺少提示。

注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。

+2

您是否有解释详细工作原理的来源,以及具体的规则是什么? –

4

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

相关问题