我在一本书上进行此练习,它要求编写一个将数组转换为列表的函数(一个具有“值”属性的对象,该属性存储值,而“剩余”属性则指向下一个值) )。
这是书中给出的解决方案:
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个元素组成的数组一起工作,超过10个元素的循环就会发生。我试图剖析代码以查看发生这种情况的确切位置……似乎是将列表分配给tempList的位置。
谁能向我解释怎么了?
答案 0 :(得分:1)
JavaScript对象本质上是通过引用调用的。因此,当您将tempList设置为list时,您只是在创建一个 pointer 而不是一个副本,因此,第二遍循环,您将list.rest设置为指向自身,从而创建了一个无限的rest-> {10,rest-> {10,rest-> 10 ......您要做的是将列表指向 new 对象,就像本书的解决方案一样。