我一直在尝试使用Eloquent 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,休息:空}}
我认为它是一个递归循环,但我不知道如何正确地构建回列表。我现在可以看到的是list的value属性被分配了myArray [i]的值,然后被赋值为null。
如果有人可以向我解释这个循环如何迭代来构建这个列表,我将不胜感激。
答案 0 :(得分: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}}
答案 1 :(得分:1)
此函数通过以相反的顺序(从最后一个元素到第一个元素)迭代myArray
,构建一个包含myArray
所有元素的单链表。
结果列表中的每个项目都有两个属性:
value
:从myArray
,rest
:代表列表中的所有下一项。循环本身不是递归的,但结果对象实际上是项目的封装(类似于LISP中的cons cells)。
循环在myArray
上向后迭代的原因是,以这种方式构建链表要容易得多:您需要做的就是维护列表的尾部(最初null
),在它前面添加一个元素,并使用生成的“增强尾部”作为下一次迭代的基础,直到没有其他元素可用。