为什么这些语句在 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;
它很好地交换了变量。请注意,我保持 x
和 y
不同,以防止由于第一个 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
是修改后的值,而不是初始值
我最近正在检查使用 XOR
函数交换两个变量的小代码。为此,我使用了 Java脚本。
设 x 和 y 为两个变量并设 x = 4, y = 6
.
x = x ^ y;
y = y ^ x;
x = x ^ y;
它很好地交换了变量。请注意,我保持 x
和 y
不同,以防止由于第一个 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
是修改后的值,而不是初始值