奇怪的JavaScript行为(赋值)

5

交换两个数

C++:

int a = 3;
int b = 5;
a^=b^=a^=b;
printf("%d, %d\n", a, b); //5, 3

PHP:

$a = 3; $b = 5;
$a^=$b^=$a^=$b;
echo "$a, $b\n"; //5, 3

Javascript:

> a=3;b=5;a^=b^=a^=b;[a,b]
[ 0, 3 ]

为什么?似乎所有变量都在执行所有表达式之前初始化...

2
你的C++示例头文件应该写上“有些C++,如果你很幸运”,因为它使用了未定义的行为。 - erikkallen
我很幸运)),我知道C++不好,只是写了一个样本并编译进行检查。 - vp_arth
2个回答

6

你在JS中的作业相当于

a = a ^ (b = b ^ (a = a ^ b));

而且这是从左到右计算的,对于a,我们得到

3 ^ (5 ^ (3 ^ 5))

因此,一种简单的解决方法是编写以下内容:
a = (b ^= (a ^= b)) ^ a;

欢迎来到JS的世界 =)


1
在ES6中,您可以简单地使用解构赋值
var a = 3
var b = 5
[a, b] = [b, a]

表现正常。


2
问题是为什么JavaScript的行为不同,而不是如何交换数字。 - Ingo Bürk
@IngoBürk 如果您使用专门用于此目的的机制,行为就不会那么奇怪了。另外:发帖人比您更有资格评论自己的意图。 - mikemaccana
谢谢,@IngoBürk是正确的,交换不是我的目标; 但是关于你的问题:我在哪里可以测试ES6?我所有的浏览器(FF、Ubuntu上的Chrome)甚至我的nodejs解释器中都有ES5。 - vp_arth
我同意即使以固定方式使用这种结构也是一个可怕的想法。但他的问题非常清楚:“为什么?”,而不是“我应该如何做?”此外,对于实际修复,ES6是一个不错的提示,但除非你有一个有限的目标群体,否则你实际上无法在生产系统中使用它。 - Ingo Bürk
@vp_auth带有harmony参数的节点以ES6模式运行,在Chrome中,它是一个标志。 - mikemaccana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接