【问题标题】:Getting error Uncaught TypeError: Cannot read property 'toLowerCase' of undefined获取错误未捕获的类型错误:无法读取未定义的属性“toLowerCase”
【发布时间】:2019-05-02 17:03:41
【问题描述】:

出现错误未捕获的类型错误:无法读取未定义的属性“toLowerCase” 在执行此代码时。

 const map  = (array, callback) => {
    return [callback(array[0])].concat(map(array.slice(1),callback));
}
var lower = map(['A','B','C'],function (val) {
    return val.toLowerCase()
});
console.log(lower);

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您需要检查数组length 是否为1,然后只返回元素,因为没有其他元素了。

    const map  = (array, callback) => {
        if(array.length === 1) return [callback(array[0])]
        return [callback(array[0])].concat(map(array.slice(1),callback));
    }
    var lower = map(['A','B','C'],function (val) {
        return val.toLowerCase()
    });
    console.log(lower);

    您似乎想创建自己的map()。认为循环比递归更好。

    const map  = (array, callback) => {
        let res = []
        for(let i = 0;i<array.length;i++){
          res[i] = callback(array[i],i)
        }
        return res;
    }
    var lower = map(['A','B','C'],function (val) {
        return val.toLowerCase()
    });
    console.log(lower);

    为什么 OP 的代码不起作用?

    有问题的代码使用递归。每当我们使用递归方法时,我们应该有一个条件来返回函数并再次调用它。

    • 现在考虑数组length1
    • 然后array.slice(1) 将返回[]
    • 一个空数组将被传递给map()
    • 对于空数组 array[0] 将 `undefined
    • 然后undefined 将被传递给callback
    • undefined.toLowerCase 抛出错误。

    结论

    当数组中只剩下一个元素时,您不需要运行 .concat(map(array.slice(1),callback)) 部分。因为concat()有更多注意事项

    【讨论】:

    • 谢谢您的帮助。但是你能解释一下为什么我们要检查数组的长度吗? @maheerali
    • @sharad 很高兴知道您想推理。我已经更新了答案,说明您应该检查长度的原因。
    猜你喜欢
    • 2014-07-06
    • 2016-03-25
    • 2018-05-16
    • 2020-11-17
    • 2021-10-13
    • 2017-06-26
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多