Javascript 产生奇数输出的数组列表。发生了什么?

Javascript 产生奇数输出的数组列表。发生了什么?,javascript,arrays,list,data-structures,linked-list,Javascript,Arrays,List,Data Structures,Linked List,我在一本书上做了这个练习,它要求编写一个函数,将数组转换为具有value属性的对象列表,该属性存储值,rest指向下一个值 以下是本书给出的解决方案: function arrayToList(array) { var list = null; for (var i = array.length - 1; i >= 0; i--) list = {value: array[i], rest: list}; return list;

我在一本书上做了这个练习,它要求编写一个函数,将数组转换为具有value属性的对象列表,该属性存储值,rest指向下一个值

以下是本书给出的解决方案:

    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, 30]));
// → {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}}
下面是我提出的解决方案:

function arrayToList(array){
  var list = {value: null, rest: null};
  var tempList={value: array[array.length-1], rest: null};
  for(var i=array.length-2; i>=0;i--){
     list.value = array[i];
     list.rest = tempList;
     tempList = list;
  }
  return list;
};
console.log(arrayToList([10, 20, 30]));
但这会产生如下结果:

{value: 10, rest: {value: 10, rest: {value: 10, …}}}
它与2个元素的数组一起工作,如果超过2个元素,则会出现10秒的循环。我试图剖析代码,看看这到底发生在哪里。。。这似乎是圣殿骑士的名单


谁能给我解释一下怎么回事吗?

Javascript对象本质上是通过引用调用的。因此,当您将templast设置为list时,您只是创建了一个指针,而不是副本,因此在循环的第二次中,您将list.rest设置为指向自身,从而创建了一个无限rest->{10,rest->{10,rest->10…..您要做的是将列表指向一个新对象,如本书的解决方案中所示。

为什么在for循环中调用array.length-2?它应该是array.length-1,如示例所示。Lloyd Nicholson,我这样做是因为我已经在循环外执行了array.length-1元素。要将其设置为array.length的rest值-循环开始时的2个元素。