2014-11-22 70 views
-2

我一直試圖通過雄辯的JavaScript教科書工作,我不能完全理解爲什麼這個循環工作,以建立一個對象列表。下面的代碼:這個循環如何在Javascript中工作?

function arrayToList(myArray) { 
    list = null 
    for (var i = myArray.length - 1; i >= 0; i--) 
    { 
     list = {value: myArray[i], rest: list}; 
    } 

    return list; 
} 

console.log(arrayToList[10,20]); 

發出{值:10,休息:{值:20,休息:空}}

我認爲它是一個遞歸循環,但我沒有看到如何正確重新回到列表中。我現在所能看到的是列表的值屬性被分配myArray [i]的值,然後被分配爲空。

如果有人可以向我解釋這個循環如何迭代構建這個列表,我將不勝感激。

+3

給它一個包含兩個以上元素的數組。也許這使得它更清晰如何工作。 – Sirko 2014-11-22 00:31:42

+0

它不是遞歸的,只需在'for'循環中將舊的'list'值賦給新的值即可。第一次迭代是'空',第二次是'{value:20,rest:null}'。 – skobaljic 2014-11-22 00:33:35

+0

我想我明白了。我會繼續努力的。謝謝您的幫助! – user3390812 2014-11-22 00:42:24

回答

2

for循環內部list變量被分配給自己。 賦值操作符根據其右操作數的值爲其左操作數賦值,這意味着:將計算右側,而不是將其分配給左側。

list = null 
---------------- 
for i=1 
myArray[1] = 20 
list = {value: 20, rest: null} 
---------------- 
for i=0 
myArray[0] = 10 
list = {value: 10, rest: {value: 20, rest: null}} 
+0

我剛纔在評論中解釋了這一點,但這是一個很好的答案版本哈哈 – 2014-11-22 00:50:52

1

該函數通過以相反順序(從最後一個元素到第一個元素)遍歷myArray來構建包含所有元素myArray的單向鏈表。

在結果列表中的每個項目具有兩個屬性:

  • value:從myArray提取的實際值,
  • rest:其代表在列表中的所有下項目。

循環本身不是遞歸的,但生成的對象實際上是項目的封裝(類似於LISP中的cons cells)。

之所以循環迭代向後超過myArray的是,它更容易建立鏈表方式:所有你需要做的是維護列表(最初null)的尾部,在前面加上一個元素,它,使用生成的'增強尾部'作爲下一次迭代的基礎,直到沒有其他元素可用。