1.便利数组
for in 输出 的是数组的下标
for of 输出的是数组中的每一项的值
const arr = [6,7,8]
// for in 返回数组的下标,但是有一个缺点,就是返回的下标是字符串数字,不能直接进行集合运算
// 使用 for in 会遍历数组所有的可枚举属性,包括原型,所以在便利数组的时候不要使用 for in
for (const key in arr) {
console.log(key);// 0,1,2
}
for (const key of arr) {
console.log(key);// 6,7,8
}
for in 便利的是数组的索引(即键名),而 for of 遍历的是数组元素值
2.遍历对象
for in 可以遍历对象 ,返回键名 for of 不能遍历对象,只能遍历带有 iterator 接口的(Set Map String Array)
const obj = {
name: 'nn',
age: 24
}
for (let key in obj) {
console.log(key);// name, age
}
Object.prototype.m = function (){
console.log(this)
}
for (let key in obj) {
console.log(key);// name, age, m
}
// for in 可以遍历到 obj 的原型方法 m,如果不想遍历原型方法和属性,可以在循环内容加判断
for (let key in obj) {
if(obj.hasOwnProperty(key)){
console.log(key);
}
}
总结: for in 适合遍历对象,for of 适合遍历数组
for in 遍历的是数组的索引,对象的原型,以及原型链上的属性
for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合. 但是不能遍历对象,因为没有迭代器对象。 与forEach()不同的是,它可以正确响应break、continue和return语句
如果想迭代一个对象的属性,可以用 for in 或内建的 Object.keys() 方法