为什么在 javascript 中向数组原型添加方法会破坏 for 循环上的迭代
Why does adding a method to the Array prototype in javascript break iteration on a for loop?
我正在一个大型遗留代码库中工作,刚刚意识到有人这样做了:
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"和"什么?"),而是得到四行。 最后两个是上面列出的两个函数。
我不想删除原始原型函数(因为上帝知道什么依赖于它们),但我想知道是否有办法防止 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])
}
您使用哪一个取决于您的浏览器支持,最后一个可以防止更改所有编写的代码
使用 .forEach
遍历数组或常规 for 循环。 for in 用于对象迭代,并将包含原型上的所有属性(这就是为什么 Object.keys(obj).forEach 是对象迭代的首选,因为它在内部执行 hasOwnProperty 检查)
for (var i in derp) {
if(derp.hasOwnProperty(i))
console.log(derp[i]);
}
但是,正常的for
循环对Array
来说比使用for-in
(实际上是针对Object的)要好得多。
for (var i = 0; i < derp.length; i++) {
console.log(derp[i]);
}
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记