JS “for (var key in arr)” >抛出我自己的 Array.prototypes,但不是固有的.为什

JS "for (var key in arr)" > throws my own Array.prototypes, but not the inherent ones. Why?

本文关键字:prototypes Array 自己的 我自己 为什 var key for in arr JS      更新时间:2023-09-26

我不小心使用了这样的迭代

for (var key in arr)
{
    alert(key);
}

并得到了一个产生一些问题的输出。(我想遍历 JSON,所以我使用了"键" - 在这种情况下,索引的"i"会更合适,毫无疑问:-)

第一个输出是indeces(如"0","1"等) - 仍然毫无疑问 - 但最后它抛出了我的Array.prototypes的名称,我在代码中的其他地方声明了。原型,如

Array.prototype.lastIndex = function(){
    return this.length - 1;
}

它只抛出"lastIndex"。

我不明白的是:我自己的非固有原型与 JS-固有的原型(如 splice()、slice() ...

以及:为什么它会扔掉它们?它们是 Array.prototype 的一部分,但不是特定 Array 对象的一部分!?

提前感谢!

    将属性
  1. 附加到对象时,默认情况下,该属性将enumerable

  2. 如果属性是可枚举的,for..in将选取它。

因此,当您使用 for..in 迭代数组对象时,它首先给出当前对象中的所有可枚举属性。然后,它沿着原型链向上移动,并提供相应对象的所有可枚举属性。因此,在您的情况下,它会沿着链向上移动,并在Array的原型中找到一个名为lastIndex的可枚举属性,并将其包含在迭代中。

如果你用enumerable: false定义它,像这样

Object.defineProperty(Array.prototype, 'lastIndex', {
    value: function() {
        return this.length - 1;
    },
    enumerable: false
});

它不会显示在for..in迭代中。引用 MDN 文档来enumerable属性,

enumerable属性属性定义属性是否显示在for...in循环中并Object.keys()

注意:始终使用普通for循环进行数组迭代。

任何数组实例都继承Array.prototype .因此,对原型的任何更改也将反映在这些数组实例中。

如果您希望它仅保留arr则将函数lastIndex附加到它,这样其他数组实例就不会受到影响。

因此,它出现在循环for..in循环中,循环访问可枚举属性,因为lastIndex是可枚举属性。