关于遍历

1.for

var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
    console.log(list[i]);
}

for可以说是最标准的循环遍历数组的方法了,不过在使用时注意缓存length(上面代码中的l = list.length),如果写成for(var i = 0; i < list.length; i++)那么每次遍历都要额外计算一次length的值。

2.forEach()

function logArrayElements(element, index, array) {
    console.log("a[" + index + "] = " + element);
}
[2, 5, 9].forEach(logArrayElements);
// logs:
// a[0] = 2
// a[1] = 5
// a[2] = 9

forEach() 方法让数组的每一项都执行一次给定的函数。回调函数接受三个参数currentValue:当前项(指遍历时正在被处理那个数组项)的值,index:当前项的索引(或下标),array:数组本身。 注意:使用forEach()是没法终止或跳出循环的,除非抛出异常。

3.every()/some()

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough); // passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);  // passed is true
passed = [12, 54, 8, 130, 44].some(isBigEnough);  // passed is true

every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 falsy(表示可转换为布尔值 false 的值)的元素。如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 true,every 就会返回 true,而some正好与之相反。

4.for..in for…in 用来循环遍历可枚举属性(包括原型链上的属性),循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。 语法: for (变量 in 对象){ //do something }

Object.prototype.bar = 0;
var obj = {a:1, b:2, c:3};
    for (var prop in obj) {
      console.log("obj." + prop + " = " + obj[prop]);
    }
    for(var i in obj) {
       if (obj.hasOwnProperty(i)) {
       console.log(i);}
    }
    // Output:
    // "obj.a = 1"
    // "obj.b = 2"
    // "obj.c = 3"
    // "obj.bar = 0"
    // a b c

由于for..in会遍历原型链上的属性,我们可以使用 hasOwnProperty 过滤(hasOwnProperty 判断一个对象是否包含自定义属性而不是原型链上的属性)。

5.for..of 之前我们用for遍历数组,其是我们只是遍历的是数组下标,用下标来指向值。在ES6中增加了for..of语法,它能直接遍历数组的值。

var arr = [ 3, 5, 7 ];
arr.foo = "hello";
for (var i in arr) {
   console.log(i); //  "0", "1", "2", "foo"
}
for (var j of arr) {
   console.log(j); //  "3", "5", "7"
}
Licensed under CC BY-NC-SA 4.0