javascript - 为什么在 javascript 中向数组原型(prototype)添加方法会中断 for 循环的迭代?

标签 javascript arrays prototype

我正在一个大型遗留代码库中工作,刚刚意识到有人这样做了:

Array.prototype.insertAt = function (i,el){ return this.splice(i,0,el); }
Array.prototype.deleteAt = function (i){return this.splice(i, 1); }

这就是我不能这样做的原因:

var derp = new Array();
derp.push('duh');
derp.push('what?');

for (var i in derp) {
    console.log(derp[i]);
}

嗯,并不是我做不到,而是如果我做到了,我会得到意想不到的结果。那不是得到两行输出(“duh”和“什么?”),而是得到四行。最后两个是上面列出的两个函数。

我不想删除原始的原型(prototype)函数(因为天知道它们依赖什么),但我想知道是否有一种方法可以防止 for 循环循环添加的函数。

最佳答案

方法 1:使用常规 for(最受支持)

for(var i=0;i<derp.length;i++){
    console.log(derp[i])
}

方法2:使用hasOwnProperty

for(var i in arr){
 if(arr.hasOwnProperty(i)){
     console.log(i)
  }
}

方法3:使用Object.defineProperty:

Object.defineProperty(Array.prototype, 'insertAt', {
    writeable: true,
    enumerable: false,
    value: Array.prototype.insertAt
})
Object.defineProperty(Array.prototype, 'deleteAt', {
    writeable: true,
    enumerable: false,
    value: Array.prototype.deleteAt
})

for(var i in derp){
    console.log(derp[i])
}

您使用哪一个取决于您的浏览器支持,最后一个可以防止更改所有编写的代码

关于javascript - 为什么在 javascript 中向数组原型(prototype)添加方法会中断 for 循环的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089705/

相关文章:

javascript - 有没有办法滚动到 react 可排序树中的特定子项?

c++如何释放和删除指向对象的二维数组

c++ - 使用类模板的 const 静态变量初始化数组大小时出错

c - 多个相同的原型(prototype)是否合法?

javascript - 如何在reactjs中使用原型(prototype)

javascript - 列出 IE8 中的所有 Array.prototype 函数-

javascript - ESLint 建议将 for.. 包装起来并使用 Object.{keys,values,entries}

javascript - 将日期数组拆分为范围

javascript - Node exec 没有执行脚本的权限

javascript - 检查数组键是否等于某个值 JavaScript