Javascript循环嵌套变量

Javascript looped nested variable

本文关键字:变量 嵌套 循环 Javascript      更新时间:2023-09-26

有点混淆了这段代码的实际工作方式,主要是因为我从未在我的第一语言(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}}

我特别困惑于list是如何和for循环一起使用的。我知道第一次通过时,列表看起来像这个list = {value: array[i], rest: null};,但在for循环的第二次通过中,另一个列表是如何嵌套在第一个列表中的?

每次调用对象文字时,都会创建一个新对象。旧的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.

list = {}list = new Object()是一样的,所以您有时会看到像这样动态实例化对象的Javascript代码。

这两个示例表示以两种不同方式创建的同一对象。它们并不完全代表您的对象,因为我创建了新的数组,而不是在循环中显示它们:

//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

通过循环,我看到它是一种递归构造,因为列表将自己用作属性。循环从列表的末尾30开始,然后返回到10。在第一次迭代中,rest: list指的是在for循环开始之前仍为null的对象(列表)。这就是为什么控制台中记录的最后一个值显示为null的原因。然后从右向左读,你得到20,然后是10。

@Derek在回答过程中做得更好。