Javascript 修改数组原型会导致foreach的行为不同

Javascript 修改数组原型会导致foreach的行为不同,javascript,arrays,prototype,Javascript,Arrays,Prototype,我注意到,每当我修改数组原型时,它都会改变foreach的行为。我创建了下面的示例来向大家展示我在做什么: Array.prototype.x = 10; for(var i in [1,2,3]){ alert(i); } 此示例显示四个警报:“1”、“2”、“3”和“x” 为什么此代码会给我4个警报 如何在不干扰foreach的情况下修改数组原型?您需要将属性定义为“不可枚举”: Object.defineProperty(Array.prototype, 'x', { e

我注意到,每当我修改数组原型时,它都会改变foreach的行为。我创建了下面的示例来向大家展示我在做什么:

Array.prototype.x = 10;
for(var i in [1,2,3]){
    alert(i);
}
此示例显示四个警报:“1”、“2”、“3”和“x”

为什么此代码会给我4个警报


如何在不干扰foreach的情况下修改数组原型?

您需要将属性定义为“不可枚举”:

Object.defineProperty(Array.prototype, 'x', {
    enumerable: false,
    value: 10
});

下面是一个示例,它显示了正在运行的代码。

当然!您可以向所有数组实例再添加一个可枚举属性。为什么您会感到惊讶?通常认为对数组使用for/in循环是个坏主意。坚持对对象使用for/in,对数组使用常规for循环。但是,您可以扩展
Array.prototype
,而无需使扩展可枚举;请看下面B方丹的正确答案。谢谢!你是最棒的。