为什么JavaScript用字符串和整数评估与负相差不同?
一个例子:
console.log(1+"1");
console.log(1-"1");
第一行打印" 11",第二行打印0。
+
操作员具有字符串的特定含义,但 -
运算符却没有。因此,当您尝试使用+
运算符,并且操作数之一是字符串时,JavaScript将整数铸成字符串,然后进行串联而不是添加。但是,当您使用-
运算符时,由于该操作员没有字符串的定义行为,因此JavaScript将字符串铸成整数,然后进行减法。
,因为加号隐式将1转换为字符串
和减号将" 1"隐式转换为int。
每个请求
tl; dr;ECMA 5规格指出,如果操作员的左侧或右侧是字符串,则返回串联的字符串结果。在减去操作员只是在数字上运行的位置,因此它将双方转换为数字
http://es5.github.io/#x11.9.3
11.6.1加法运算符( )#ⓣⓡⓖ加法操作员要么执行字符串串联或数字添加。
生产添加表达:添加表达 乘法表达方式如下:
让lref成为评估加法表达的结果。
让lval为getValue(lref)。
让rref是评估乘法表达的结果。
令rval为getValue(rref)。
让lprim是最繁荣(lval)。
让rprim成为最繁荣(rval)。
如果类型(LPRIM)是字符串或类型(RPRIM)是字符串,则返回串联ToString(LPRIM)的结果,然后是ToString(RPRIM)
将加法操作应用于Tonumber(LPRIM)和Tonumber(RPRIM)的结果。请参阅下面的注释11.6.3。
注意1在步骤5和6中呼叫的呼叫中没有提示。除日期对象外,所有本机ecmascript对象都处理没有提示,就好像给出了提示号一样;日期对象处理没有提示,就好像给出了提示字符串一样。主机对象可能会以其他方式处理提示。
注2步骤7与关系运算符的比较算法的步骤3不同(11.8.5),使用逻辑或操作而不是逻辑和操作。
11.6.2减去操作员( - )#ⓣ生产添加表达:添加表达 - 乘法表达的评估如下:
让lref成为评估加法表达的结果。
让lval为getValue(lref)。
让rref是评估乘法表达的结果。
令rval为getValue(rref)。
让lnum为tonumber(lval)。
让rnum为tonumber(rval)。
返回将减法操作应用于lnum和rnum的结果。请参阅下面的注释11.6.3。