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?
我不小心使用了这样的迭代
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 对象的一部分!?
提前感谢!
- 将属性
附加到对象时,默认情况下,该属性将
enumerable
。如果属性是可枚举的,
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
是可枚举属性。
- 如何为json对象中的段发送array[]
- Array.length似乎不起作用;console.log则显示其他情况
- 如何迭代Array.prototype函数
- Javascript 新的 Array 和 join() 方法
- Array.lenght = undefined
- Javascript setTimeout for an array
- NodeJS API调用中Array中的Push和Pull元素
- 如何取消object.prototypes javascript的一个函数
- 如何在MongoDB中将String转换为Array
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 您的平台不支持RxJS-Array.observe
- 在Jquery/Javascript中的Array中插入Textbox值
- 通过jQueryAjax一起发布Array和Form数据时出现问题
- Array.every返回false,而不是类型error
- Javascript-通过i=0直接传递array[0]与array[0],array[i]在“;如果“;陈述
- JavaScript Array unshift() 以一种不可变的方式
- 为什么可以't我用Set对象调用Array.prototype.map
- Array方法中的Javascript循环
- 为什么这个array.filter总是不返回任何内容
- JS “for (var key in arr)” >抛出我自己的 Array.prototypes,但不是固有的.为什