Javascript 为什么这些连锁速记员不起作用?
在javascript中使用链式速记运算符编写交换函数时,我偶然发现了一些让我非常困惑的东西 该代码应该交换a和b值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;
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生成的字节码是什么样子。希望有用