JavaScript中 for of 和 for in 的区别?

JavaScript数组高阶函数,点击跳转详解


1. for…in 循环出的是 key, for…of 循环出的是 value

let arr = ['x', 20, { a: 1, b: 2 }];


// for...in 循环出的是 key
for (let key in arr) {
    console.log(arr[key]);
}
// x 20 {a: 1, b: 2}


// for...of 循环出的是 value
for (let value of arr) {
    console.log(value);
}
// x 20 {a: 1, b: 2}

2. for…in 循环对象 ,for…of 循环数组(推荐)

for...in 循环对象:

let my = {
    name: '猫老板的豆',
    title: '吃饭睡觉打豆豆',
    age: 20,
    address: {
        country: 'china',
        city: 'shenzhen',
        school: 'hi-tech park'
    }
}

for (let key in my) {
    console.log(key); // name title age address
    console.log(my[key]); // '猫老板的豆' '吃饭睡觉打豆豆' 20 {country:'china',city:'shenzhen',school:'hi-tech park'}
}

for...of 循环数组:

let arr = ['x', 20, { a: 1, b: 2 }];

// for...of 循环出的是 value
for (let value of arr) {
    console.log(value);
}
// x 20 {a: 1, b: 2}

3. for…of 不能循环普通的对象,需要通过和 Object.keys() 搭配使用

如果实在想用 for...of 来遍历普通对象的属性的话,可以通过和 Object.keys() 搭配使用,先获取对象的所有 key 的数组
然后遍历:

let my = {
    name: '猫老板的豆',
    title: '吃饭睡觉打豆豆',
    age: 20,
    address: {
        country: 'china',
        city: 'shenzhen',
        school: 'hi-tech park'
    }
}

for (let key of Object.keys(my)) {
    //使用Object.keys()方法获取对象key的数组
    console.log(key + ": " + my[key]);
}

4. for…of 是 ES6 新引入的特性,修复了 ES5 引入的 for…in 的不足

咋一看好像好像只是写法不一样而已,那为什么说 for...of 修复了 for...in 的缺陷和不足。
假设我们往数组添加一个属性name:

let arr = ['x', 20, { a: 1, b: 2 }];
arr.name = 'demo';

// for…in循环
for (let key in arr) {
    console.log(arr[key]);   // arr.name也被循环出来了
}
// x 20 {a: 1, b: 2} demo

// for…of循环
for (let value of arr) {
    console.log(value);
}
// x 20 {a: 1, b: 2}

所以说,作用于数组的 for-in 循环除了遍历数组元素以外,还会遍历自定义属性。

for...of 循环不会循环对象的 key ,只会循环出数组的 value,因此 for...of 不能循环遍历普通对象,对普通对象的属性遍历推荐使用 for...in


5. for…of 常用于异步的遍历

function muti(num) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(num * num)
    }, 1000)
  })
}

let arr = [1, 2, 3];

// 同步遍历 1秒后立即输出 1 4 9
arr.forEach(async (i) => {
  const res = await muti(i)
  console.log(res)
})

// 异步遍历 1秒后输出1,2秒后输出4,2秒后输出9
(async function (){
  for (let i of arr) {
    console.log(await muti(i));
  } 
}())
posted @ 2022-07-20 18:16  猫老板的豆  阅读(70)  评论(0编辑  收藏  举报