for循环
JavaScript 提供多种遍历语法。最原始的写法就是for
循环。
console.log(myArray[index]); // 1 2 3 4 5
}
缺点:这种写法比较麻烦
forEach
数组提供内置的forEach
方法
console.log(element); // 1 2 3 4 5
});
缺点:这种写法的问题在于,无法中途跳出forEach
循环,break
命令或return
命令都不能奏效。
for...in
for…in 用于遍历对象所有的可枚举属性,功能类似于Object.keys()。
console.log(prop); // name phone
}
可能有朋友会问,不可枚举的对象有哪些呢? 比如constructor,数组的length就属于不可枚举属性。
console.log(prop); // '0' '1' '2' '3' '4'
}
缺点:
- 数组的键名是数字,但是
for...in
循环是以字符串作为键名“0”、“1”、“2”等等。 for...in
循环主要是为遍历对象而设计的,不适用于遍历数组
for...of
for…of是ES6新增的遍历方式,它提供了统一的遍历机制。所有实现了[Symbol.iterator]接口的对象都可以被遍历。for...of
循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串
优点:
- 有着同
for...in
一样的简洁语法,但是没有for...in
那些缺点 - 不同用于
forEach
方法,它可以与break
、continue
和return
配合使用 - 提供了遍历所有数据结构的统一操作接口
下面是一个使用break语句,跳出for...of
循环的例子。
上面的例子,会输出斐波纳契数列小于等于1000的项。如果当前项大于1000,就会使用break
语句跳出for...of
循环。
for...of获取索引
entries()
返回一个遍历器对象,用来遍历[键名,键值]
组成的数组。对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries
方法。keys()
返回一个遍历器对象,用来遍历所有的键名。values()
返回一个遍历器对象,用来遍历所有的键值。
类似数组的对象
类似数组的对象包括好几类。下面是for...of
循环用于字符串、DOM NodeList 对象、arguments对象的例子。
console.log(s); // h e l l o
}
// DOM NodeList对象
let paras = document.querySelectorAll("p");
for (let p of paras) {
p.classList.add("test");
}
// arguments对象
function printArgs() {
for (let x of arguments) {
console.log(x);
}
}
printArgs('a','b');
// 'a'
// 'b'
并不是所有类似数组的对象都具有 Iterator 接口,一个简便的解决方法,就是使用Array.from方法将其转为数组。
for (let x of arrayLike) {
console.log(x);
}
// 正确
for (let x of Array.from(arrayLike)) {
console.log(x); // 'a' // 'b'
}
普通的对象
对于普通的对象,for...of
结构不能直接使用,会报错,必须部署了 Iterator 接口后才能使用。
console.log(e);
}
// edition
// committee
// standard
for (let e of es6) {
console.log(e);
}
// TypeError: es6 is not iterable
解决方法是,使用Object.keys
方法将对象的键名生成一个数组,然后遍历这个数组。