javascript - 为什么这些链式速记运算符不起作用?

标签 javascript operators shorthand chained

在 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如果有人想快速亲自尝试一下。

最佳答案

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

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

关于javascript - 为什么这些链式速记运算符不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11609681/

相关文章:

operators - OCaml 中的扫描和负整数文字

c++ - 缩短 C++ 枚举成员的路径(使用 typedef 或 typename),用作模板参数

javascript - 嵌套对象引用有简写吗?

javascript - 从 Javascript 事件处理程序引用文档范围

java - &= 和 |= 在 Java 中

javascript - 将您的 Javascript 分成单独的文件会对性能产生影响吗?

Javascript 编程 : Is dot [.] 总是一个运算符(operator)?

javascript - 对象中的条件变量

javascript - wysihtml5 文本区域大小调整

javascript - Spotify Web-API & 传输用户的播放 : malformed JSON