使用方法之
一、 for in -(ES5)(注意会遍历原型方法和属性)
问题: i是字符串索引,顺序不确定,会遍历所有可枚举属性,包括原型上的method和name
用处: 常用于遍历对象(由于会遍历原型上的方法,需要用hasOwnPropery方法可以判断某属性是否是该对象的实例属性)
对比: Object.keys()获取实例属性组成的数组,不包括原型方法和属性
遍历数组(不推荐)
const arr = [3,2,4]
for (const i in arr) { // i是索引字符串
console.log(i, arr[i])
}
遍历对象
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
for (var key in myObject) { // key是键名
console.log(key, myObject[key]);
}
二、for of -(ES6)
问题:不能遍历普通对象,因为没有迭代器对象
用处:遍历 数 / 数组对象 / 字符串 / map / set 等拥有迭代器对象的集合
对比: 与forEach()不同的是,它可以正确响应break、continue和return语句
遍历数组
for (let item of [3,2,4]) {
console.log(item)
}
遍历可迭代对象map
遍历map对象时适合用解构,例如;
for (var [key, value] of phoneBookMap) {
console.log(key + "'s phone number is: " + value);
}
myObject.toString()会使对象转化为字符串
myObjectSymbol.iterator方法,变成可迭代对象,就可以遍历这个对象了
可迭代对象的概念几乎贯穿于整门语言之中,不仅是for-of循环,还有Map和Set构造函数、解构赋值,以及新的展开操作符。
迭代器对象可以是任意具有.next()方法的对象,for-of循环将重复调用这个方法,每次循环调用一次。
遍历普通对象
首先调用集合的Symbol.iterator方法,返回一个新的迭代器对象。
var zeroesForeverIterator = {
[Symbol.iterator]: function () {
return this;
},
next: function () {
return {done: false, value: 0};
}
};
链接:https://www.jianshu.com/p/c43f418d6bf0