Javascript 为什么这些连锁速记员不起作用?

Javascript 为什么这些连锁速记员不起作用?,javascript,operators,shorthand,chained,Javascript,Operators,Shorthand,Chained,在javascript中使用链式速记运算符编写交换函数时,我偶然发现了一些让我非常困惑的东西 该代码应该交换a和b值 var a = 4532; var b = 969; a^=b^=a^=b; 但它不是:b=4532,而是a=0 如果我将此代码分成两行,它将按预期工作 var a = 4532; var b = 969; b^=a^=b; a^=b; 技术上的解释是什么 注:如果有人想自己快速尝试一下,这里有一些提示。在回答你的问题之前,你能告诉我下面代码的结果吗 var c = 1;

在javascript中使用链式速记运算符编写交换函数时,我偶然发现了一些让我非常困惑的东西

该代码应该交换a和b值

var a = 4532;
var b = 969;

a^=b^=a^=b;
但它不是:b=4532,而是a=0

如果我将此代码分成两行,它将按预期工作

var a = 4532;
var b = 969;

b^=a^=b;
a^=b;
技术上的解释是什么


注:如果有人想自己快速尝试一下,这里有一些提示。

在回答你的问题之前,你能告诉我下面代码的结果吗

var c = 1;
c += c += 1;
你可能认为是4,自己试试看:)

我不知道javascript代码是如何在幕后解释的。以下是我试图解释为什么会发生这种情况的方式

通过
a+=b
,它等于
a=a+b
。所以,
c+=c+=1
c=c+(c=c+1)
。赋值形式为
(c+(c=c+1))
,结果为
(c+c+1)
。在这里,我认为这是关键点,它令人困惑,变量
c
仍然是
1
,尽管我们在第一个赋值
c+=1
中重新赋值
c+1

所以,
a^=b^=a^=b
等于
a=a^b^a^b
,即
0
。因为对
a
的内部更改被忽略,或者可能是一个bug

我的另一个猜测是,代码可以这样展开:

c = 1 + (c = 1 + 1)// in form of c = c + (c = c + 1)
这只是我的猜测,因为我不知道VM生成的字节码是什么样子。希望有用