当我调用.length时,为什么这个数组是不确定的?

Goo*_*ord 10 javascript arrays recursion

我正在从Eloquent JavaScript这本书开始练习(参见链接页面底部的'列表').基本上,我想创建一个带有数组的对象,并将其转换为具有以下结构的列表:

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

当我在控制台中运行下面的代码时,我得到了TypeError: Cannot read property 'length' of undefined (line 3 in function arrayToList).为什么我调用的数组.length没有定义?

function arrayToList(array){
    var list = {};
    if(!array.length){
        list.value = null;
    }
    else{
        list.value = array.shift();
        list.rest = arrayToList();
    }
    return list;
}

console.log(arrayToList([10, 20]));
Run Code Online (Sandbox Code Playgroud)

注意: Stack Overflow问题JavaScript中的列表数据结构是关于同一问题的非常相似的帖子.我不是在寻找解决方案,而是在递归调用中解释什么是乱七八糟的.

the*_*eye 12

list.rest = arrayToList();
Run Code Online (Sandbox Code Playgroud)

由于您未传递任何参数arrayToList,因此array将具有默认值undefined.这就是它失败的原因

TypeError:无法读取未定义的属性"length"

因此,在递归调用期间,您应该再次传递一个数组arrayToList.

function arrayToList(array) {
    var list = {};
    if (!array.length) {
        list.value = null;
    } else {
        list.value = array.shift();
        list.rest = arrayToList(array);   // Pass the `array` after shifting
    }
    return list;
}

console.log(arrayToList([10, 20]));
# { value: 10, rest: { value: 20, rest: { value: null } } }
Run Code Online (Sandbox Code Playgroud)