在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。
答案 0 :(得分:2)
在回答您的问题之前,您能告诉以下代码的结果吗?
var c = 1;
c += c += 1;
您可能认为它是4,请亲自尝试:)
我不知道如何解释javascript代码。我试图解释为什么会发生这种情况。
按a += b
,它等于a = a + b
。因此,c += c += 1
是c = 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生成的字节码是怎样的。希望它有用。