Javascript循环嵌套变量

时间:2015-03-04 04:14:55

标签: javascript variables for-loop nested

有点混淆这段代码实际上是如何工作的,主要是因为我从来没有在我的第一语言(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的第二次传递中嵌套在第一个列表中?

2 个答案:

答案 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在答案中更好地说明了这个过程。