【问题标题】:Javascript looped nested variableJavascript循环嵌套变量
【发布时间】:2015-03-04 04:14:54
【问题描述】:

有点困惑这段代码实际上是如何工作的,主要是因为我从未见过在我的第一语言 (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 循环的第二次通过时,另一个列表如何嵌套在第一个列表中?

【问题讨论】:

    标签: javascript variables for-loop nested


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,也很好奇您是如何制作这幅插图的?
    • @ApathyBear 我使用的输入法让我输入box drawing characters
    【解决方案2】:

    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 的原因。然后从右向左阅读,你得到 20,然后是 10。

    @Derek 在他的回答中更好地说明了这个过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多