【问题标题】:Javascript increment while assigning分配时的Javascript增量
【发布时间】:2012-11-13 22:50:15
【问题描述】:

我正在讨论前缀增量运算符,我们似乎遇到了分歧。

运行此代码时:

var x = 0;
x = ++x;

第二行相当于:

  • x = (x = x + 1) 或
  • x = (x + 1)

很难区分,因为结果是相同的(两者都导致 x 的值为 1)

我相信当赋值的左侧是变量本身时,该值不会保存到原始变量中。

我的对手不同意,并认为只要使用 ++ 运算符,该值就会保存到原始变量中。

我们谁是对的?

【问题讨论】:

    标签: javascript variable-assignment increment prefix-operator


    【解决方案1】:

    它被保存了,所以它和第一个例子类似。 以这段代码为例:

    var v = 0;
    v = ++v + ++v + ++v;
    // Returns 6
    

    那是因为这将转化为:

    v = (0+1) + ((0+1)+1) + (((0+1)+1)+1);
    

    或者,更准确地说:

    v = 0+1 +
    v = 1+1 + //Previous value of v + 1
    v = 2+1   //Previous value of v + 1
    

    为什么?

    ++v会先保存v的增量值,然后返回这个增量值。
    为了简化操作,请在您的控制台中尝试以下操作:

    x = 0;
    ++x;
    

    如果++x 将解析为x + 1,那么x 的值现在仍将是0,对吧?
    不,您的 x 将是 1。这意味着++x 中必须有一个赋值运算符。

    【讨论】:

    • 我不是说++x 解析为x+1。我是说它解析为x=x+1,但是当它位于操作的右侧时,分配不会发生。
    • @Asad:赋值总是发生,不管它写在哪里:它本身就是一个表达式。 JS 与几乎任何其他语言一样,会首先从内到外解析语句中的所有表达式。不同之处在于:++x 解析为递增的值,而x++ 解析为 x 在递增之前的值,只需尝试 x=0,然后尝试 x++,最后在控制台中尝试 x:@987654341 @、0(1 将是结果。然后尝试++x,它会立即显示2:返回值是增量运算符first时的new
    • 但是如果分配没有发生,v = ++v + ++v; 会返回2,但它会返回3
    • @EliasVanOotegem 这就是我想说的,是的,该评论是对 Asad 的回复
    【解决方案2】:

    在阅读ECMAScript Language Specification 以回答问题后,++x 似乎等同于x = ( x = x + 1 )

    规范概述的步骤的翻译是:

    1. 操作的结果将分配给 x
    2. 如果某些条件为真,则抛出错误
    3. oldValue = x
    4. newValue = oldValue + 1
    5. 将 newValue 分配给 x
    6. 返回新值

    对于后自增运算符,上面将返回 oldValue 而不是 newValue

    var x = 0;
    // x is assigned 1 during the post-increment operation but because
    // the oldValue is returned it is immediately replaced by 0.
    x = x++; 
    console.log( x ) // prints 0
    

    【讨论】:

      【解决方案3】:

      在做:

      var x = 0;
      console.log(++x); // will make print 1
      

      在做:

      var x = 0;
      console.log(x++); // will make print 0
      console.log(x); // will print 1
      

      【讨论】:

      • 不完全正确 `x = x++;` 将 1 赋给 x,然后再次将旧值 (0) 重新赋给 x:JS 将首先尝试解析所有表达式为一个值,x++ 被解析为 0,然后 将 +=1 分配给 x,但解析后的值 0 分配给 x...
      • 是的。你说得对。对不起。我只是指当前正在执行的语句。
      • 没有区别:语句由 2 个表达式组成,这两个表达式都 have 被执行,并且它们都分配了新的值。是他们执行的顺序决定了 x 的整体值,在第一种情况下,x 被分配 1两次,在第二个例子中,x 被分配 1,然后是 0
      【解决方案4】:

      只需尝试将++xx++ 都写成完整的英文句子:
      ++x:将 x 加一并返回值
      x++:返回 x 的值,然后递增它。

      你的第二行 (x = ++x;) 相当于 x = (x += 1),是的。
      看看你写过的任何循环:

      for (var i = 0;i<100;i++)//<-- no need for another assign here
      

      所以你也可以写成++x;,但由于这个表达式是整个语句,所以你写x++;++x没有区别...

      您可能知道xxsomeVar 将变量递增 1,将结果值分配给该变量然后返回它,someVar++ 返回变量的 当前 值,然后将其递增乘以 1(当然,新值也被分配给变量)。

      所以++x; 等价于x = (x + 1);

      来自语言规范:
      ++prefix increment operator
      Postfix++ increment operator

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 2012-10-09
        • 2016-02-20
        • 2018-11-09
        • 2023-03-09
        • 2019-08-26
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        相关资源
        最近更新 更多