有点混淆这段代码实际上是如何工作的,主要是因为我从来没有在我的第一语言(Python)中看到过像这样使用的变量
function arrayToList(array) {
var list = null;
for (var i = array.length - 1; i >= 0; i--)
list = {value: array[i], rest: list};
return list;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}
我对如何使用for循环list
特别感到困惑。我理解第一次通过,列表看起来像这个list = {value: array[i], rest: null};
,但是另一个列表如何在for-loop的第二次传递中嵌套在第一个列表中?
答案 0 :(得分:4)
每次调用对象文字时,都会创建一个新对象。旧的list
指针存储在新的list
中,并在将指针存储到list
变量中的新对象后立即存储。
list = null;
//First iteration
list = {value: 30, rest: null};
│
└────────────────────────┐
//Second iteration │
list = {value: 20, rest: list}; //<-- see this list right here?
// it's being put in before the
// assignment happens.
//so this effectively becomes
list = {value: 20, rest: {value: 30, rest: null}};
//etc.
答案 1 :(得分:1)
list = {}
与说list = new Object()
相同,因此您有时会看到即时实例化对象的Javascript代码。
这两个示例表示以两种不同方式创建的同一对象。因为我创建新数组而不是在for循环中显示它们,所以它们并不完全代表你的对象:
//option 1
list = new Object();
list.value = new Array();
list.rest = list;
//option 1
list = {}; //new object
list.value = []; //new array
list.rest = list;
//recall these are each equivalent ways of creating the same object
迭代循环,我发现它是一种递归构造,因为list将自己用作属性。循环从列表末尾30开始,然后返回10.在第一次迭代中,rest: list
引用一个对象(列表),它在for循环开始之前设置为null。这就是为什么控制台中记录的最后一个值显示为null。然后从右到左阅读你得到20,然后是10。
@Derek在答案中更好地说明了这个过程。