for in 与 for of 的区别

87 阅读1分钟

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() 方法