2015-02-23 46 views
3

下面的代碼示例來自Eloquent Javascript第4章練習4.3(列表)。循環條件如何工作?

爲什麼下面的代碼中的for循環在 for-loop是「node」的情況下停在中間位置?

function listToArray(list) { 
    array = []; 
    for (var node=list; node; node = node.rest) 
    array.push(node.value); 
    return array; 
} 

list = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } }; 
console.log(listToArray(list)); 
+1

當節點爲空時它會停止,因爲這將返回falsey值這導致循環終止。 – DoctorMick 2015-02-23 11:26:28

回答

4

首先,我們可以寫不同的方式程序會更理解

function listToArray(list) { 

    array = []; 
    for (var i=list;i; i = i.rest) 
    { 
    array.push(i.value); 
    alert(array) 
    } 
} 

var listobject = { value: 10, rest: { value: 20, rest: { value: 30, rest: null } } }; 

listToArray(listobject); 

這裏的ListObject是一個object literal並使用for循環,我們遍歷對象字面值或對象字面值的屬性。

我們可以把代碼

1)listToArray(listobject);

這是函數調用,在這裏我們傳遞的對象作爲參數傳遞給函數的每一行。

2)當此代碼執行,然後控制轉移到函數定義

function listToArray(list) { ...} 

這裏列表就是我們通過在函數調用時同樣的論點。

3)array = []; 函數裏面我們聲明瞭一個數組,最初數組沒有元素。

4)接下來是我們的for循環。 for (var i=list;list; i = i.rest)

內部循環首先我們指定var i = list;

意味着我們的對象列表中的所有的財產分配給我

這意味着我們可以通過i訪問對象的每個屬性,

例如:

i.value將導致10

5)next條件語句在這裏是i並且在你的程序中它是節點

都在這種情況下相同的含義:

病情會假時i爲空,你的情況node爲空。

6)i=i.rest

它將給對象的對象或值的屬性。

例子:listobject.value will result 10

listobject.rest.value will result 20 

listobject.rest.rest.value will result 30 

7)最後array.push(i.value);

值添加到我們的陣列,並在此我們數組包含10,20,30

+0

謝謝你的詳細解答!我想知道.rest方法是如何工作的?它是否提供了listobject.value工作的能力?那麼它也允許listobject.rest工作呢?有這方面的文件嗎? – 2015-08-13 16:15:24

+1

@EricPark當你指定var i = list時,那麼列表對象的所有屬性都被賦值給i,那麼我們可以使用i.object peroperty – 2015-08-17 04:55:49

0

我有你同樣的問題:我不清楚,我希望對於一本學習JavaScript的書來說,它會得到更好的解釋。然後我停了下來,思考,並考慮了下面的事情。

作者的「錯」,恕我直言,在於一件簡單的事情:而不是簡單地寫node作爲第二個陳述,他可以寫node != null,這將更加突出和教學友好(「做循環while節點不爲空「:因爲node僅在最後一次迭代中爲空 - 然後返回false - 它會在那裏停止):嘗試自己,這個工作