为什么这些链式速记操作员不工作?

时间:2012-07-23 09:22:54

标签: javascript operators shorthand chained

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

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

var a = 4532;
var b = 969;

a^=b^=a^=b;

但它没有:b = 4532,但a = 0.

如果我将这些代码分成2行,它就会按预期工作。

var a = 4532;
var b = 969;

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

技术解释是什么?

PS:如果有人想快速尝试自己,那么the code on jsfiddle

1 个答案:

答案 0 :(得分: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,尽管我们在第一个作业{{1}中重新分配了新值c + 1 }。

因此,c += 1等于a^=b^=a^=b,即a = a^b^a^b。因为0的内部更改被忽略,或者可能是错误?

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

a

这是我所有的猜测,因为我不知道VM生成的字节码是怎样的。希望它有用。