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

时间:2016-07-21 17:10:37

标签: javascript xor

我最近检查了甜蜜的小代码,使用a.example.com b.example.com WHATEVER_SUB-DOMAIN_TEXT.example.com 函数交换两个变量。我为此使用了JavaScript。

让x和y为两个变量,让XOR

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似乎也是等效表达式,会产生与第二种情况相同的不正确结果。

但是,所有这些语句都在Java上等效运行并且始终如一地产生相同的结果。

我还使用了JavaScript的严格模式。

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

1 个答案:

答案 0 :(得分:4)

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是修改后的值,而不是初始值。