对于纯对象的遍历,for..in
要厉害一些;
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
var arr = [3, 5, 7];
arr.foo = 'hello';
for (var i in arr) {
// 如果不需要输出原型上的属性,可以用 arr.hasOwnProperty(i) 判断,返回false的则是原型上的属性
console.log(i);
}
// 结果是:
// 0
// 1
// 2
// foo
// arrCustom
// objCustom
对于数组遍历,如果不需要知道索引,for..of
迭代更合适,因为还可以中断;
如果需要知道索引,则forEach()
更合适;只可惜forEach遍历数组的时候是无法break
或者return false
中断的。
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
var arr = [3, 5, 7];
arr.foo = 'hello';
arr.forEach(function (value, i) {
console.log(i);
});
// 结果是:
// 0
// 1
// 2
对于其他字符串,类数组,类型数组的迭代,虽然for..in
也有这方面能力,但for..of好像
更厉害。
for..of是es6提供的新语法。
for...of :迭代,可以迭代字符串、arguments类数组对象、NodeList这类DOM集合、Map、Set、generators...
即原型上具有 [Symbol.iterator] 属性的数据类型才可以使用 for..of。
[Symbol.iterator] 属性值是一个函数,执行该函数会返回一个迭代器,调用该迭代器的next方法就可以逐项遍历数据本身元素了。