JavaScript使用for...in迭代数组分析(不推荐)

for...in与其说是迭代,更恰当的说法应该是枚举。其目的是用来枚举object对象的属性,包括对象所继承的属性。

有部分人会使用for...in来迭代数组,这是一种误用。

以下对使用for...in迭代数组分析。

问题一

var a = ['a','b'];
a[5] = 'e';
for (var x in a) {
    console.log(x);
}

输出结果:

0
1
5

比较于:

for (var x of a) {
  console.log(x);
}

输出结果:

a
b
undefined
undefined
undefined
e

for...in只会输出设置了值的索引值,而for...of会迭代数组里所有的值。

问题二
在Array的原型上添加方法。

Array.prototype.hello = function () { 
  console.log("say hello");
};

对数组执行for...in 

var a = ['a','b'];
a[5] = 'e';
for (var x in a) {
    console.log(x);
}

输出结果:

0
1
5
hello

for...in也会枚举Array原型添加的方法。

总结

上面的两个问题归根到底for...in是枚举Array的属性,而非数组里的元素。其中arr[x]是使用下标添加属性的一种方式。所有除非是要枚举Array的属性,否则不推荐使用for..in迭代数组元素。迭代数组元素使用for...of。

版权声明:著作权归作者所有。

相关推荐

MySQL 5.7推荐使用ALTER USER修改密码

MySQL修改用户的密码主要有两种方法:ALTER USER 和SET PASSWORDALTER USER 基本使用ALTER USER testuser IDENTIFIED BY '123456'; 修改当前登录用户ALTER USER USER() IDENTI

JavaScript删除数组里重复的元素

JavaScript里有多种方法可以用来对数组元素去重。ES6 SetES6提供了一个Set对象,用它可以很简单便可以对数组元素去重。function uniq(arr) {    return Array.from(new Set(arr)); } filter另外也可以通过filter来对数组元素去重。functi

JavaScript判断两个数组是否相等

首先判断两个数组是否相等时不能直接使用==var array1 = []; var array2 = []; console.log(array1 == array2); //输出false 对于对象来说,==比较的是两个对象是否为同一个对象。数组属于对象类型,尽管数组元素是相同的,但这两个数组属于不同的对象