【问题标题】:Javascript ++ vs +=1Javascript ++ 与 +=1
【发布时间】:2010-12-09 11:57:08
【问题描述】:
var a = "ab";
var b = "ab";
a+=1; // "ab1"
b++; // "NaN"

(在 chrome 的 V8 上测试)

有人可以根据++ 算术运算符和+= 赋值运算符(带参数1)的内部原子操作来解释为什么结果不同

【问题讨论】:

  • 试试a = '12';,然后试试++--+=1-=1。 JavaScript 很有趣。

标签: javascript


【解决方案1】:

++ 转换为数字,然后递增,+= 与字符串连接。

来自规范:

11.3.1 后缀自增运算符

  ...
3. 设oldValueToNumber(GetValue(lhs))
4. 使用与+ 运算符相同的规则(参见 11.6.3),让 newValue 成为将值 1 与 oldValue 相加的结果。

对于a+=1 的情况,如果您将数字添加到字符串中,或​​者以其他方式将数字转换为字符串:

11.6.1 加法运算符 (+)

  ...
7.如果Type(lprim)是String或者Type(rprim)是String,那么
一种。 返回将 ToString(lprim) 后跟 ToString(rprim) 的结果字符串

  8. 返回对 ToNumber(lprim) 和 ToNumber(rprim) 应用加法运算的结果。

【讨论】:

  • 这仅涵盖了一半的问题,您还应该注意,在+=1 的情况下,1 被转换为 为字符串 用于连接。
【解决方案2】:
  • ++ 尝试增加一个 Number(如果它不是一个数字,这将失败 - 导致 NaN
  • += 是连接,在这种情况下,JavaScript 引擎发现一侧是字符串,因此它们都被连接作为字符串

它们是不同的,因为它们是不同的操作,++ 是一个特定的 arithmetic operator,而 += 是一个更通用的 assignment operator,它的行为根据数据类型而不同 - 具体来说,string has its own implementation .

【讨论】:

  • 你会认为++ & +=1 在逻辑上是等价的。我想我忘了+ 对字符串和数字超载
  • @Raynos - 是的,好吧,字符串重载++=,但更多的是++ 是特定于这里的数字:)
  • @nick:我真的很好奇你,因为我真的看到你回答问题 24/7 这真的很好:D 帮助人们希望我能做到这一点,但我真的很想知道你睡吗 !?你有工作吗? :D
  • @Raynos, @Nick Craver:我认为x += 1 的等价物是++x,而不是x++
  • @Omeid - 检查我的活动日志,我昨天早上 7 点左右就下班了;)看起来不是这样,因为你很可能和我在同一时间 :)
【解决方案3】:

这是因为 javascript 中的 + 运算符既是数学 + 也是字符串连接运算符,而 ++ 始终是数学运算符。

所以,当你有:

string = string + number;

数字转换为字符串并连接到第一个字符串。

当你有

string++

您会将字符串转换为数字,得到 NaN,然后​​在其上加一 - 保持静止,NaN。

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多