为什么这些语句在 JavaScript 中的作用不同?

Why do these statements work differently in JavaScript?

我最近正在检查使用 XOR 函数交换两个变量的小代码。为此,我使用了 Java脚本。

设 x 和 y 为两个变量并设 x = 4, y = 6.

x = x ^ y; y = y ^ x; x = x ^ y;

它很好地交换了变量。请注意,我保持 xy 不同,以防止由于第一个 XOR.

而可能发生的别名

然后,根据声明,我写道: x = x ^ (y = y ^ (x = x ^ y )); 这会正确地交换变量 y 但会使 x 总是 0.

此外,x ^= y ^= x ^= y; 似乎也是等价的表达式,但会产生与第二种情况相同的错误结果。

但是,所有这些语句 运行 在 Java 上等价并始终产生相同的结果。

我还在 Java脚本中使用了严格模式。

这三个语句在某种程度上在 JavaScript 上是不是等价的,还是我在这里遗漏了一些关键的东西?

x = x ^ y;
y = y ^ x;
x = x ^ y;

之所以有效,是因为它就像

x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;

然后,

x_final = x_2 = x_1 ^ y_1 = x_0 ^ y_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ y_0 ^ x_0 ^ y_0
        = y_0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
        = x_0;

你的x = x ^ (y = y ^ (x = x ^ y ));就像

x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_0 ^ y_1;

然后,

x_final = x_2 = x_0 ^ y_1 = x_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ x_0 ^ y_0
        = 0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
        = x_0;

如果你使用 x = (y = y ^ (x = x ^ y )) ^ x; 就可以了。

那是因为JS是从左到右解析表达式的,你希望x是修改后的值,而不是初始值