在下面的JavaScript代码中:-
var a = [];
for (i in a) {
alert(i);
}
我得到 o/p 作为 - $family、$constuctor、每个、克隆、清理、调用、关联、链接、包含、附加、getlast、getRandom、include、组合、擦除、空、扁平、pick、hexToRgb、rgbToHex。
谁能解释为什么会这样?它是否必须对 Array 对象的属性执行某些操作,如果是这样,那么为什么没有提醒所有属性?另外,如果我们取一个空对象文字,如var a = {},我们没有得到任何o/p。
现在,如果我像这样更改上面的代码:-
var a = [9,2];
for (i in a) {
if (a.hasOwnProperty(i)) {
alert(a.hasOwnProperty(i));
alert(i);
}
}
我得到的输出为 0 和 1.为什么会这样?这些是这个数组对象的属性(也是索引)吗?
for-in 语法适用于对象。它迭代对象的所有字段,包括方法。当您想要迭代数组时,请始终使用以下命令:
for (var i = 0; i < array.size; i++) {
doSomething(array[i]);
}
后一个带有 hasOwnProperty
的循环不会循环访问数组的标准方法,因为数组a
从基 Array 类继承了这些方法,因此它们不是它自己的属性。但是当你显式地将方法添加到数组时,它还应该列出该函数,因为它现在是一个自己的属性:
var a = [9,2];
a.hello = function() { };
for (i in a) {
if (a.hasOwnProperty(i)) {
alert(a.hasOwnProperty(i));
alert(i);
}
}
这应该列出 0、1 和你好。
如果您期望它输出 9 和 2,并且想知道为什么它会输出 0 和 1:这是因为 for-in 数组迭代键,而不是值。数组基本上是对象,其中每个数组元素都是一个以数组索引作为名称的属性。所以
var a = [9, 2];
等效于这个对象(加上从 Array 继承的东西):
var a = {
0: 9,
1: 2
}