var a = "ab";
var b = "ab";
a+=1; // "ab1"
b++; // "NaN"
(在chrome的V8上测试)
根据++
算术运算符和带有参数+=
的{{1}}赋值运算符的内部原子操作,有人可以解释为什么结果会有所不同
答案 0 :(得分:10)
++
尝试增加数字(如果它不是数字,则会失败 - 导致NaN
)+=
是连接,在这种情况下,JavaScript引擎会发现一边是字符串,因此它们都是连接成字符串。它们是不同的,因为它们是不同的操作,++
具体是arithmetic operator,而+=
是更一般的assignment operator,其行为有所不同,基于数据类型 - 具体而言,string has its own implementation。
答案 1 :(得分:9)
++
转换为数字,然后以字符串连接为+=
递增。
来自规范:
11.3.1后缀增量运算符
...
3.让oldValue
成为ToNumber(GetValue(lhs))
4.让newValue
成为将值1添加到oldValue
的结果,使用与+
运算符相同的规则(参见11.6.3)。
对于a+=1
情况,如果您向字符串添加数字,或者以相反的方式将数字转换为字符串:
11.6.1加法运算符(+)
...
7.如果Type(lprim)
是String或Type(rprim)
是String,那么
一个。 返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串8.将添加操作的结果返回ToNumber(lprim)和ToNumber(rprim)。
答案 2 :(得分:4)
那是因为javascript中的+运算符既是数学+又是字符串连接运算符,而++总是数学运算符。
所以,当你有:
string = string + number;
将数字转换为字符串并连接到第一个字符串。
当你有
时 string++
你会将字符串转换为数字,获得NaN,然后添加一个 - 静止,NaN。