Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的javascript行为(赋值)_Javascript_Swap_Operator Precedence - Fatal编程技术网

奇怪的javascript行为(赋值)

奇怪的javascript行为(赋值),javascript,swap,operator-precedence,Javascript,Swap,Operator Precedence,交换两个号码 C++: PHP: Javascript: > a=3;b=5;a^=b^=a^=b;[a,b] [ 0, 3 ] 为什么??看起来所有变量都是在所有表达式执行之前初始化的…您在JS中的赋值相当于 a = a ^ (b = b ^ (a = a ^ b)); 这是从左到右计算的,对于a,我们得到 3 ^ (5 ^ (3 ^ 5)) 因此,一个简单的解决办法就是写作 a = (b ^= (a ^= b)) ^ a; 欢迎来到JS=)在ES6中,您可以简单地: 这是预期的

交换两个号码

C++:

PHP:

Javascript:

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

为什么??看起来所有变量都是在所有表达式执行之前初始化的…

您在JS中的赋值相当于

a = a ^ (b = b ^ (a = a ^ b));
这是从左到右计算的,对于a,我们得到

3 ^ (5 ^ (3 ^ 5))
因此,一个简单的解决办法就是写作

a = (b ^= (a ^= b)) ^ a;
欢迎来到JS=)

在ES6中,您可以简单地:


这是预期的行为。

你的C++示例头应该说“一些C++,如果你运气好的话,因为它使用了未定义的行为。”,(我知道C++坏,只写一个样本,编译一个检查)我很幸运)问题是JavaScript行为为什么不同,不是如何交换数字。@IngoBürk如果你使用一种明确用于此目的的机制,这种行为就不会那么奇怪了。另外:海报比你更适合评论他们自己的意图。谢谢,@IngoBürk是对的,swap不是我的目标;但是关于你的:我在哪里可以测试ES6?我所有的浏览器(FF,Ubuntu上的Chrome)甚至我的nodejs解释器都有ES5。我同意即使以固定的方式使用这个结构也是一个糟糕的想法。但他的问题很清楚“为什么?”,而不是“我应该怎么做?”。此外,对于实际的修复,ES6是一个很好的提示,但除非您有一个有限的目标组,否则您还不能在生产系统中实际使用它。@vp_auth节点和harmony参数在ES6模式下运行,它是一个标志。
3 ^ (5 ^ (3 ^ 5))
a = (b ^= (a ^= b)) ^ a;
var a = 3
var b = 5
[a, b] = [b, a]