总的来说有三个区别:
适用的目标不一样:
for in 适用于可枚举数据,例如对象、数组、字符串
for of 适用于可迭代数据,列入,array,string,map,set,typedArray,函数的arguments对象,nodeList对象
const obj = { id: 1, name: '懒洋洋', age: 3 }
const a = 'str'
const num = 123456
console.log(Object.getOwnPropertyDescriptors(obj));
console.log(Object.getOwnPropertyDescriptors(a));
console.log(Object.getOwnPropertyDescriptors(num));
const arr = new Set(['1', '2'])
const it = arr[Symbol.iterator]()
console.log(it.next());
console.log(it.next());
遍历的范围不一样:
for in 可以遍历原型链上的可枚举属性
for of 一般只能遍历自身的(具体和迭代器内部实现有关)
Array.prototype.off = 4
const arr = ['1', '2']
for (let key in arr) {
console.log(arr[key]); //1,2,4
}
得到的结果不一样:
for in 返回的是key ,且不能保证顺序
for of一般得到的是值(具体和迭代器内部实现有关)