【问题标题】:Why are these chained shorthand operators not working?为什么这些链式速记运算符不起作用?
【发布时间】:2012-07-21 12:29:41
【问题描述】:

在 javascript 中使用链式速记运算符编写交换函数时,我偶然发现了一些让我很困惑的东西。

此代码应该交换 a 和 b 值。

var a = 4532;
var b = 969;

a^=b^=a^=b;

但它不是:b = 4532,而是 a = 0。

如果我将这段代码分成两行,它会按预期工作。

var a = 4532;
var b = 969;

b^=a^=b;
a^=b;

技术解释是什么?

PS:如果有人想自己快速尝试,这里是the code on jsfiddle

【问题讨论】:

    标签: javascript operators shorthand chained


    【解决方案1】:

    在回答你的问题之前,你能说出下面代码的结果吗?

    var c = 1;
    c += c += 1;
    

    你可能相信是4,自己试试吧:)

    我不知道如何在后台解释 javascript 代码。以下是我试图解释为什么会发生这种情况的方法。

    a += b 等于a = a + b。所以,c += c += 1c = c + (c = c + 1)。以(c + (c = c + 1)) 形式赋值,结果为(c + c + 1)。这里我认为是关键点,而且很混乱,变量c 仍然是1,虽然我们在第一次赋值c += 1 时给它重新赋值了一个新值c + 1

    所以,a^=b^=a^=b 等于 a = a^b^a^b,即 0。因为对a 的内部更改被忽略了,或者它可能是一个错误?

    我的另一个猜测是,代码可能会这样展开:

    c = 1 + (c = 1 + 1)// in form of c = c + (c = c + 1)
    

    这都是我的猜测,因为我不知道 VM 生成的字节码是什么样子的。希望有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2013-09-17
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多