面试题7:for…in与for…of的区别

栗子1:遍历数组

const arr1 = [a, b, c];
	  for (let i in arr1) {
	    console.log(i)  // 0, 1, 2
	  }
	  
	  const arr2 = [a, b, c];
	  for (let i of arr2) {
	    console.log(i) // a, b, c
	  }

for in 返回数组的下标(key); for of 返回数组的元素; ……………………………………………………………………………………………………………………………………………… 栗子2:给数组手动添加属性

const arr3 = [a, b];
  arr3.name = c;
  for (let i in arr3) {
    console.log(i) // 0, 1, name
  }

for in 循环可以遍历出name这个键名 ……………………………………………………………………………………………………………………………………………… 栗子3:遍历对象

const json = {"a": 1, "b": 2, "c": 3};
  for (let i in json) {
    console.log(i) // a, b, c
  }
  for (let i of json) {
    console.log(i)
  }

for in遍历获取对象key值; for of 报错; ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… for in 的特点: for … in 循环返回的值都是数据结构的 键值名。 遍历对象返回的对象的key值; 遍历数组返回的数组的下标(key)。

for … in 循环不仅可以遍历数字键名,还会遍历原型上的key值和手动添加的其他键;

特别情况下, for … in 循环会以任意的顺序遍历键名

总结一句: for in 循环特别适合遍历对象。 …………………………………………………………………………………………………………………………………………………… …………………………………………………………………………………………………………………………………………………… for of 特点: for of 循环用来获取一对键值对中的值,而 for in 获取的是 键名

一个数据结构只要部署了 Symbol.iterator 属性, 就被视为具有 iterator接口, 就可以使用 for of循环。

例3这个对象,没有 Symbol.iterator这个属性,所以使用 for of会报json is not iterable

for of 不同与 forEach, 它可以与 break、continue和return 配合使用,也就是说 for of 循环可以随时退出循环。

提供了遍历所有数据结构的统一接口; …………………………………………………………………………………………………………………………………………………… 哪些数据结构部署了 Symbol.iteratoer属性了呢? 只要有 iterator 接口的数据结构,都可以使用 for of循环。

数组 Array Map Set String arguments对象 Nodelist对象, 就是获取的dom列表集合 以上这些都可以直接使用 for of 循环。 凡是部署了 iterator 接口的数据结构也都可以使用数组的 扩展运算符(…)、和解构赋值等操作。 …………………………………………………………………………………………………………………………………… 我也想让对象可以使用 for of循环怎么办?使用 Object.keys() 获取对象的 key值集合后,再使用 for of

const obj = {a: x, b: y};
  for (let i of Object.keys(obj)) {
    console.log(i) // a, b
  }

也可以给一个对象部署 Symbol.iterator属性。

经验分享 程序员 微信小程序 职场和发展