for...in....和for...of...

40 阅读1分钟
  1. for...in...遍历可枚举对象,得到可枚举对象的属性值。而for...of...遍历可迭代对象,得到可迭代对象的值(注意是值,不是属性值)。如下例中,采用两种方式遍历数组。
let arr = [1,2,3];

for (let item in arr) {
    console.log(item);//输出:0,1,2。数组的索引,for...in输出的是可枚举对象的值
}

for (let item of arr) {
    console.log(item);//输出1,2,3
}
  1. 可枚举对象VS可迭代对象
  • 数组既是可枚举对象也是可迭代对象
  • 普通对象是可枚举,但不可迭代
  • map,set是可迭代的,但是不可枚举
let obj = {1: "b", "a" : 2};
let map = new Map([[1,"b"], ["a", 3]]);
let arr = [1,2,3];

//遍历可枚举的对象的非符号属性,遍历得到的是属性,而且是乱序的,
for(let item in obj) {
    console.log(item);//输出:1,a
}
for (let item in map) {
    console.log(item);//无输出,因为map是不可枚举的对象
}
for (let item in arr) {
    console.log(item);//输出:0,1,2。数组的索引。数组是可枚举对象,for...in输出的是可枚举对象的值
}

//遍历可迭代对象的值
// for(let item of obj) {
//     console.log(item);//obj是不可迭代对象
// }
for (let item of map) {
    console.log(item);//map是可迭代对象,输出[1,'b'], ['a', 3]。for...of遍历的是值
}
for (let item of arr) {
    console.log(item);//输出1,2,3
}
  1. for...in不保证遍历顺序,for...of遍历按照元素插入的顺序。