【问题标题】:Why is this array undefined when I call .length?为什么当我调用 .length 时这个数组未定义?
【发布时间】:2014-10-24 14:13:44
【问题描述】:

我正在做本书中的一个练习Eloquent JavaScript (see 'a list' at bottom of linked page)。基本上,我想创建一个对象,它接受一个数组并将其转换为具有以下结构的列表:

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};

当我在控制台中运行下面的代码时,我得到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]));

注意: Stack Overflow 问题 List data structures in JavaScript 是关于同一问题的非常相似的帖子。我在这里寻找的不是解决方案,而是对递归调用中出现问题的解释。

【问题讨论】:

  • 一个想法:函数 arrayToList() 需要一个数组作为参数。在递归调用中,它没有得到那个参数......
  • 尝试在调试器中跟踪函数。
  • 请注意,错误并不是说.length 是未定义的。

标签: javascript arrays recursion


【解决方案1】:
list.rest = arrayToList();

由于您没有将任何参数传递给arrayToList,因此array 将具有默认值undefined。这就是为什么它失败了

TypeError: 无法读取 undefined

的属性“长度”

因此,在递归调用期间,您应该再次将数组传递给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 } } }

【讨论】:

    【解决方案2】:

    在这一行:

        list.rest = arrayToList();
    

    …你递归调用函数但你没有指定参数,所以array变成undefined

    看来您应该再次传递array(您已修改)。

        list.rest = arrayToList(array);
    

    live demo

    【讨论】:

      【解决方案3】:

      在递归 arrayToList 调用中,您没有将任何内容作为参数 (!) 传递。

      【讨论】:

        【解决方案4】:
        function arrayToList(array) {
            var list = {};
            if (!(array instanceof Array) || array.length == 0) {
               list.value = null;
            } else {
                list.value = array.shift();
                list.rest = arrayToList();
            }
            return list;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 2014-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多