2

在 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:如果有人想快速尝试一下,这是 jsfiddle 上的代码。

4

1 回答 1

2

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

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 生成的字节码是什么样子的。希望它有用。

于 2012-07-23T10:41:34.777 回答