正如你所說,從左至右,這意味着第一次遇到該表達式的值,其值仍是5。這可以歸結爲:
var a = 5, b = 3;
a = (a -(b = (a = a+b) - b));
a = 5 - (b = (a=(5+3)) - b);
a = 5 - (b = 8 - b);
a = 5 - 5; AND b = 5
在第二個,在賦值後評估a值,因爲它在右邊
var a = 5, b = 3;
a = ((b = (a = a+b) - b) - a);
a = ((b = 8 - b) - a); AND a = 8
a = (5 - 8); AND a = 8; AND b = 5;
a = - 3;
這一切都歸結爲操作數的評估順序。
通常情況下,在第一種情況下,a評估爲5,然後b = (a = a+b) - b
進行評估,並且只在此評估過程中發生變化的值,但未回溯。
在第二示例中,(b = (a = a+b) - b)
首先計算,改變一個值至8,然後進行評價,並且被發現是8
一個更簡單的例子是:
var a = 5
a = a + (a = 2)
// a = 7
a
評估爲5,則(a = 2)
評估爲2並且a設置爲2,然後評估5+2
並將a設置爲7。
在另一方面:
var a = 5
a = (a = 2) + a
// a = 4
(a = 2)
進行評估,以2和被設置爲2,則a
被評估爲2,則2+2
被評估並且被設定爲4
誰叫 A =(A - (B =(A = A + B) - B)); 給了我'a = 0和b = 5' –
是的,我最好的猜測是在表達式(a = a + b)之前設置爲5,所以一個停留5. – Cameron