JavaScript中的数组遍历

96 阅读2分钟

这篇文章主要参考了stackoverflow上面的一些回答,并且搜索了一些资料而成。其主要目的在于消除自己在使用这些迭代方法上的一些困惑。

就语言层面上来说,现在存在5种迭代方式:

  1. 使用forEach (ES5+)
  2. 使用简单的for循环
  3. 使用for-in
  4. 使用for-of (ES6+)
  5. 使用迭代器 (ES6+)

使用forEach

兼容性:IE8及以下IE浏览器浏览器不支持。

使用方法:

var a = ["a", "b", "c"];
a.forEach(function(entry) {
    console.log(entry);
});

其它同类方法,兼容性同上:

  • every: 在迭代函数第一次返回false或等价于false的值的时候停止迭代
  • some: 和every相反,在迭代函数第一次返回true或等价于true的值的时候停止迭代
  • filter: 过滤一个数组,返回迭代函数返回true的项所组成的数组
  • map: 返回迭代函数返回值所组成的数组
  • reduce: 创建一个由迭代函数返回值所生成的值,具体规则查阅mdn-array-reduce
  • reduceRight: 逆序的reduce方法

使用简单的for循环

兼容所有浏览器,如果脚本在浏览器端运行,尽量使用这种方式:

var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
    console.log(a[index]);
}

使用for-in

for-in是用来遍历对象的属性的语法。如果想用它遍历一个数组的话可使用如下方法:

var key;
var a = [];
a[0] = "a";
a[10] = "b";
a[10000] = "c";
for (key in a) {
    if (a.hasOwnProperty(key)  &&        // These are explained
        /^0$|^[1-9]\d*$/.test(key) &&     // and then hidden
        key < 4294967295                         // away below
        ) {
        console.log(a[key]);
    }
}

这里进行了两个条件检查,原因有两个:

  1. for-in会遍历原型链,为了放置js遍历父级原型,则需要调用hasOwnProperty方法。
  2. 检查索引,索引是数字并且小于2^32 - 1

使用for-of (ES6+)

ES6(草稿)增加了对迭代器的支持,迭代一个数组的最便捷的语法是使用for-of,这个语法只有chrome38、firfox13、safari7.1支持。

var val;
var a = ["a", "b", "c"];
for (val of a) {
    console.log(val);
}

使用迭代器 (ES6+)

同上,只是for of会在语言层面直接调用迭代器。

var a = ["a", "b", "c"];
var it = a.values();
var entry;
while (!(entry = it.next()).done) {
    console.log(entry.value);
}