javascript - Array.prototype.forEach native 实现问题

标签 javascript arrays

<分区>

我正在尝试实现原生的 forEach 方法。这是我的代码:

Array.prototype.myEach = function(cb) {
     for(let i=0; i<this.length; i++) {
         cb(this[i], i)
     }
}

如果我声明 let a = [](某物)然后运行 ​​[].myEach 那么它就可以工作了。

let a = [1,2,3,4,5]; // or even []

[1,2,3,4,5].myEach(function(val, i){
    console.log(val); //works
});

但如果我不在顶部声明数组,它甚至无法识别原型(prototype)。

[1,2,3,4,5].myEach(function(val, i){ //fails
    console.log(val);
});

问题:

如果我删除 let a = [1,2,3,4,5],执行 [1,2,3,4].forEach 会失败。

我不明白为什么。

最佳答案

在 myEach 函数后包含一个分号:

Array.prototype.myEach = function(cb) {
     for(let i=0; i<this.length; i++) {
         cb(this[i], i)
     }
};

[1,2,3,4,5].myEach(function(val, i){ 
    console.log(val);
});

没有分号,解析如下:

Array.prototype.myEach = function(cb) {
     for(let i=0; i<this.length; i++) {
         cb(this[i], i)
     }
}[1,2,3,4,5].myEach( ....etc

[1,2,3,4,5] 尝试从函数(对象)获取属性 5 - 就像您编写了 function (){}[5]。没有属性 5,因此这是未定义的,尝试在未定义的情况下调用 myEach 会出错。

原来的工作是因为中间的 let 语句实现了分离(多亏了分号,但与实际的 let a = 语句无关)。

关于javascript - Array.prototype.forEach native 实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442469/

相关文章:

java - 数组代码故障排除 - 我的代码有什么问题?

javascript - 在 javascript 中创建一个对象,该对象具有带有可选名称/值对的 'init' 方法

ios - 如何降低从数组中选取图像的时间复杂度

javascript - 固定位置的绝对效果

javascript - 如何在 IE8 中通过 GET/POST 请求发送长 JSON 字符串?

javascript - 每 50px 为元素设置不同的高度

python - python列表上的变量滑动窗口

javascript - 使用对象属性从对象数组中删除对象

javascript 在五秒内逐渐改变变量

javascript - 在 Javascript 中使用 reduce 将每个单词的首字母大写