2013-09-27 32 views
0

讓我們評估交換兩個變量的代碼:有人可以解釋javascript算術表達式是如何工作的嗎?

var a = 5, b = 3; 
a = (a -(b = (a = a+b) - b)); 

我期待那的a新的價值應該是3b值應5。但我的價值爲a = 0 and b = 5;

我去讀EcmaScript算術表達式,發現這將從左到右進行評估。 (但不完全清楚)。

所以,我想這一個

var a = 5, b = 3; 
a = ((b = (a = a+b) - b) - a); 

現在,我得到a = -3 and b = 5。有人可以解釋爲什麼會發生這種情況嗎?

回答

1

正如你所說,從左至右,這意味着第一次遇到該表達式的值,其值仍是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

1
var a = 5, b = 3; 
a = ((b = (a = a+b) - b) - a); 

它將以這種方式運行。

a = a + b //8 
b = a - b //8-3=5 
a = b - a //5-8=-3 
+0

誰叫 A =(A - (B =(A = A + B) - B)); 給了我'a = 0和b = 5' –

+0

是的,我最好的猜測是在表達式(a = a + b)之前設置爲5,所以一個停留5. – Cameron

0
a = (a -(b = (a = a+b) - b)) 

與此類似

a = (5 -(b = (a = 5+3) - 3)) // a = 8 
// a = (5 - (b = 8 - 3)) // b = 5 
// a = (5 - 5) // a = 0 

這意味着它將在一氣呵成具有相同的初始值代替a和b =左側, 這不是與此類似序列

a = a+b; // a = 8 
b = a-b; // b = 5 
a = a-b; // a = 3 

如您所願。

2

這裏是解釋,我希望它很清楚,因爲它不是那麼明顯。 JS和所有其他語言創建樹來評估表達式。樹根據它們的位置和大括號爲每個運算符分配一個權重。

首先,這裏是步驟JS將處理表達:

Step 0. a = (a - (b = (a = a+b) - b)); a=5, b=3 
Step 1.     a = a+b    a=8, b=3 
Step 2.    b = a - b     a=8, b=5 
Step 3. a = a - b        a=0, b=5 

在它處理一個運營商的每個步驟。

,這是它從你表達創建樹:

= 
/ \ 
a  - 
    / \ 
    a  = 
     /\ 
     b -    
      /\ 
      = b 
     /\ 
      a + 
      /\ 
      a b 

樹,然後從下往上處理。

+0

但是,在第三步中'a = ab'應該給我結果爲'a = 3和b = 5'。不是嗎?因爲step2將'a和b'的值更改爲'a = 8和b = 3'。我有點困惑 –

+0

看看我的回答:http://stackoverflow.com/a/19045816/1324929。 @KLiFF沒有提及的是,在賦值時,第一步是右側的表達式評估。因此,a =(a-(b =(a = a + b)-b))變爲a =(5-(b =(a = 5 + 3)-3)))。在那之後,右側,從內面到外面,a = 5 + 3,a變成8,b = 8-3,b變成5,最後a = 5-5,a變成0,b保持爲5. – itmitica

+0

不完全是。樹從左向右進行處理,否則在第一個左節點中a = 8。 – njzk2

0
var a = 5, b = 3; 
a = (a -(b = (a = a+b) - b)); 

1)A = A(5) - (表達,其中2份將很快計算)

2)B =(A = A的其餘+ B //它仍然不計算) - b(其爲如圖3所示,因爲新的b尚未改變)

3)= 5的(a)+ 3(b)= 8

4)b(我們回點2) = 8(新的a)-3(舊的b)= 5

5)a(點1)= 5(舊的a)-5(新的b)= 0

新α= 0,新的B = 5

var a = 5, b = 3; 
a = ((b = (a = a+b) - b) - a); 

1)B =(A = A + B) - 圖3(b)

2)= 5的(a)+ 3 (b)= 8

3)b = 8(新一) - 3(舊b)= 5

4)(最終)= 5(新b) - 圖8(新一)= - 3

新a = -3,新b = 5

我希望這是可讀的:d

相關問題