[英]javascript for-in loop
正如定义所指出的,for-in循环用于遍历对象的属性,而不是为什么循环数组的元素?
var arr = ['a','b','c'], indexes = [];
Array.prototype.each = function() {/*blah*/};
for (var index in arr) {
indexes.push(index);
}
indexes; //["0", "1", "2", "each"]
为什么要枚举0,1,2?不是属性
从documentation
引用:
for..in不应用于遍历索引顺序很重要的Array。 数组索引只是具有整数名称的可枚举属性,其他方面与常规Object属性相同。 无法保证for ... in将以任何特定顺序返回索引,并且将返回所有可枚举的属性,包括具有非整数名称的属性和被继承的属性。
因为迭代的顺序取决于实现,所以在数组上进行迭代可能不会以一致的顺序访问元素。 因此,在访问顺序很重要的数组上进行迭代时,最好使用带有数字索引的for循环(或Array.forEach或非标准的for ... of循环)。
掌握您问题答案的关键是以下句子:
数组索引只是具有整数名称的可枚举属性,其他方面与常规Object属性相同。
以下句子总结了一下:
for..in不应用于遍历索引顺序很重要的Array。
数组中具有数组元素的每个索引都是该数组的属性。 因此,这基本上就是您的阵列在幕后的样子:
>>> arr
{
0: 'a',
1: 'b',
2: 'c',
'each': function() {}
'length': 3
};
这些键是可枚举的,这就是为什么您在输出中看到它们的原因。
for
in
循环遍历键,而不是值。 因此,它给您的数组索引0、1、2而不是值。
您可以这样做,但是for in
数组上使用for in
是不好的做法。
for (var index in arr) {
indexes.push(arr[index]);
}
您应该使用常规的for
循环
for (var i = 0; i < arr.length; i++) {
indexes.push(arr[i]);
}
for...in
遍历对象的可枚举属性。 Array
的可枚举属性是索引。
可以在此处找到更多信息。
AMCAScript 6定义了for...of
运算符 ,该运算符允许对值进行迭代。 但是,这尚未被采纳。
是的,如果您真的想使用in而不使用键,则可以将值变成这样的键,例如:
var arr = {'a':1,'b':1,'c':1};
for(var index in arr)
indexes.push(index);
与设置arr ['a'] = 1等相同。的确,for..in遍历键-而不是值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.