Fork me on github

for...of 和 for...in的区别

for...of

  • es6 引入的一种遍历迭代器的循环语句
  • 用于遍历可迭代对象的值(如数组、字符串、Set、Map、Generator 等)
  • 每次迭代,for...of 会将可迭代对象的下一个值赋值给一个变量,然后执行循环体
  • for...of 不支持遍历普通对象,因为普通对象并不是可迭代的
/**
 * 使用 for ... of 遍历对象属性
 * es6
 */
const obj = {
    name: '张三',
    age: 18,
}
console.log('for ... of 遍历对象属性 ==> 根据对象的 key 遍历')
for(const key of Object.keys(obj)) {
    console.log(key, obj[key])
}
/*
name 张三
age 18
 */
console.log('for ... of 遍历数组对象')
const arr = [1,2,3]
for(const num of arr) {
    console.log(num)
}
/*
1
2
3
 */


// console.log('--------------------------')

// 下面这种情况会报错,因为对象obj是不可迭代的
/**
 * TypeError: obj is not iterable
 *     at Object.<anonymous> (/Users/z/Desktop/a/notes/frontend/js/for/of.js:18:19)
 *     at Module._compile (node:internal/modules/cjs/loader:1254:14)
 *     at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
 *     at Module.load (node:internal/modules/cjs/loader:1117:32)
 *     at Module._load (node:internal/modules/cjs/loader:958:12)
 *     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
 *     at node:internal/main/run_main_module:23:47
 */
// for(const item of obj) {
//     console.log(item)
// }

 

for...in

  • 遍历对象的可枚举属性
  • 遍历数组的时候会遍历数组的索引,而不是值
  • 需要过滤继承自原型链的属性
/**
 * for...in
 * 遍历对象属性的循环语句
 * 用于遍历对象的可枚举属性(包括继承自原型链的属性)
 * 也可以遍历数组,但是不推荐,因为它会遍历数组的索引(字符串类型),而不是值
 */

const obj = {
    a: 1,
    b: 2,
    c: 3,
}

for(const key in obj) {
    console.log(key, obj[key])
}
/*
a 1
b 2
c 3
 */

console.log('过滤掉继承自原型链的属性')

for(const key in obj) {
    if(obj.hasOwnProperty(key)) {
        console.log(key, obj[key])
    }
}

console.log('for...in 遍历数组')
const arr = [1,2,3]
for(const index in arr) {
    console.log(index, arr[index])
}
/*
0 1
1 2
2 3
 */

 

posted @ 2023-07-03 19:54  zjy4fun  阅读(13)  评论(0编辑  收藏  举报