为什么这些语句在JavaScript中的工作方式不同?

Ozi*_*zil 11 javascript xor

我最近检查了甜蜜的小代码,使用XOR函数交换两个变量.我为此使用了JavaScript.

设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上等效运行,并且始终如一地生成相同的结果.

我还使用JavaScript的严格模式.

这三个陈述在某种程度上不等同于JavaScript或我错过了一些关键的东西吗?

Ori*_*iol 4

x = x ^ y;
y = y ^ x;
x = x ^ y;
Run Code Online (Sandbox Code Playgroud)

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

x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;
Run Code Online (Sandbox Code Playgroud)

然后,

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;
Run Code Online (Sandbox Code Playgroud)

你的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;
Run Code Online (Sandbox Code Playgroud)

然后,

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;
Run Code Online (Sandbox Code Playgroud)

如果你使用的话它会起作用x = (y = y ^ (x = x ^ y )) ^ x;

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