为什么迭代数组会将我的自定义原型函数显示为项目?

时间:2015-09-25 01:21:49

标签: javascript arrays matrix

为什么要创建自定义prototype功能,例如:

Array.prototype.clone = function(){
    return JSON.parse(JSON.stringify(this));
}

在迭代for循环时使它们可见?

例如: enter image description here

很明显我的array里面有arrays,但由于某种原因,它在循环内部时会考虑我的所有自定义函数。为什么?我该如何预防?

OBS:我正在申请某种javascript竞赛,它采用我的算法并与其他玩家对战。此循环位于运行器内部,因此请注意,更改迭代处理方式不是一种选择。

这会破坏跑步者,因为它试图执行一些代码,认为我的自定义函数包含在列中。

但是,看看他们的代码,我注意到可以防止这种情况发生,因为他们也编辑/创建Array.prototype函数。

1 个答案:

答案 0 :(得分:1)

不要使用for...in循环迭代数组。 for...in循环枚举对象的所有属性,并且由于您的新原型函数是可枚举的,因此它也将被列出。避免这种情况的方法是使用array.hasOwnProperty,但是为什么在使用常规for循环正确迭代数组时呢?它会更快并且使用更少的代码:

for (var i = 0; i < this.matrix.length; i++) {
    ...
}

要在枚举对象的属性时不显示新功能,您需要使其不可枚举:

Object.defineProperty(Array.prototype, 'clone', {
    enumerable: false,
    value: function(obj) {
        return JSON.parse(JSON.stringify(obj));
    }
});