gpt4 book ai didi

javascript - 为什么 .forEach() 不能在 Array.prototype.fillB() 中工作? (自定义函数)

转载 作者:行者123 更新时间:2023-11-28 13:25:30 25 4
gpt4 key购买 nike

我开始尝试原型(prototype),但遇到了一个我不明白的情况。

我正在尝试向数组原型(prototype)添加 .fill(val) 方法。

此代码取自另一个 StackOverflow 答案,有效:

Array.prototype.fillA = function(val) {
var i;

for (i = 0; i < this.length; i++) {
this[i] = val;
}

return this;
};

看起来我可以用 .forEach 来清理它:

Array.prototype.fillB = function(val) {

this.forEach(function(origVal, i, theArray) {
theArray[i] = val;
});

return this;
};

但这行不通。 (调用.fillB后,数组并没有改变)。

那么,.fillB 到底出了什么问题?

以下是一些演示该问题的可运行代码片段:

.fillA()

Array.prototype.fillA = function(val) {
var i;

for (i = 0; i < this.length; i++) {
this[i] = val;
}

return this;
};

var arr,
output;

arr = new Array(5).fillA(5);

alert('arr = "' + arr.join(',') + '"');

.fillB()

Array.prototype.fillB = function(val) {

this.forEach(function(origVal, i, theArray) {
theArray[i] = val;
});

return this;
};

var arr,
output;

arr = new Array(5).fillB(5);

alert('arr = "' + arr.join(',') + '"');

免责声明:

  • 我知道在覆盖 .fill() 函数之前,您实际上应该检查原型(prototype)中是否存在 .fill() 函数。
  • 像这样修改全局原型(prototype)可能会对其他代码库执行诸如(for..in 等)之类的操作产生意想不到的后果,因此这通常是一个坏主意。
  • .fillA 和 .fillB 实际上会做不同的事情,即 .fillA 仅适用于从 0 开始的连续数组,但 .fillB 应该适用于所有数组。

最佳答案

原因已记录here :

forEach() executes the provided callback once for each element present in the array in ascending order. It is not invoked for indexes that have been deleted or are undefined because no value was provided for them when the array was initialized.

new Array(5) 创建一个长度为 5 的数组(因此 fillA() 按预期工作),但没有值。

关于javascript - 为什么 .forEach() 不能在 Array.prototype.fillB() 中工作? (自定义函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com