在INT和String上操作时,为什么JavaScript评估Plus和减去不同



为什么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。

最新更新