首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这些语句在JavaScript中的工作方式不同?

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

Stack Overflow用户
提问于 2016-07-22 01:10:37
回答 1查看 158关注 0票数 11

我最近检查了使用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 )); This正确地交换了变量y,但使x始终为0

此外,看起来也是等价表达式的x ^= y ^= x ^= y;产生了与第二种情况相同的错误结果。

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

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

这三个陈述在JavaScript上是不是不等价,还是我在这里漏掉了什么关键的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-22 07:48:32

代码语言:javascript
复制
x = x ^ y;
y = y ^ x;
x = x ^ y;

这是可行的,因为它就像

代码语言:javascript
复制
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;

然后,

代码语言:javascript
复制
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 ));是这样的

代码语言:javascript
复制
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_0 ^ y_1;

然后,

代码语言:javascript
复制
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成为修改后的值,而不是初始值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38510401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档