携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
之前遍历的对象,发现不能用for···of遍历,就很奇怪。一直以来,我认为for···in都是用来遍历数组的,for···of是遍历对象。
等我用for···of遍历时,去控制台查看报错,报错的是:obj不是一个迭代器。
在之前遍历都是for循环,而es6新增的for···of,for···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却不会了。