for in 和 for of 的区别

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

之前遍历的对象,发现不能用for···of遍历,就很奇怪。一直以来,我认为for···in都是用来遍历数组的,for···of是遍历对象。
等我用for···of遍历时,去控制台查看报错,报错的是:obj不是一个迭代器。

在之前遍历都是for循环,而es6新增的for···offor···in可以很方便的帮助我们开发。

一、for···of

for···of时只会遍历迭代器,而对象则不是迭代器\

迭代器:是一种用于遍历的统一机制,这种机制允许我们调用next()方法,每次调用都会返回一个对象 {value,done},当完成迭代后done值为true,value为每次获取的元素。

可用for···of迭代: String、Array、Map、Set、arguments对象、NodeList集合\

而我去看数组原型,上面中有Symbol(Symbol.iterator): ƒ values()这个方法,表示数组是可迭代的,而我去看上面几个原型上都有这个方法。Object原型却没有这个方法。

  • 那么如何解决将普通对象变成可迭代对象呢?

第一种

es6中的Object.getOwnPropertyNames方法,将所得到的key存成一个数组,遍历这个key取值,但是我这里有个问题,上面enumerable: false中b,也被遍历出来。

const keys = Object.getOwnPropertyNames(obj);
console.log(keys)    //['a', 'b', 'c']
for (let k of keys) {
    console.log("这是枚举之后的值",obj[k]);   //这是枚举之后的值 2 这是枚举之后的值 3 这是枚举之后的值 4
}

第二种

继续用for···in遍历,取出对象的key值

for (let k in obj) {
    console.log("这是枚举之后的值",obj[k]);    //这是枚举之后的值2
}

第三种

Object.keys()这个相当于第一种的升级版,名字更方便记忆

const keys = Object.keys(obj);
console.log(keys)    //['a', 'b', 'c']
for (let k of keys) {
    console.log("这是枚举之后的值",obj[k]);   //这是枚举之后的值 2 这是枚举之后的值 3 这是枚举之后的值 4
}

二、 for···in

直接遍历出来取key值

for(let k in obj){
    console.log(obj[k]);  //2 3
}

每种语言有没种的写法,Java写多了,有时候不能区分Java和js的一些写法,js写多的,Java却不会了。