for…in 和 for…of 区别,以及使用
for…of 的特性
- for…of 需要有 iterator 的支持才能进行遍历。
- 有 iterator 支持的数据结构有:Array Map Set String 函数的arguments对象 NodeList对象
- object 对象不可以,因为 object 中的属性没有先后顺序,但是可以主动添加 iterator 属性
- 如何添加 iterator 属性,在对象中添加 “Symbol.iterator” 属性,就可以使用 for…of 遍历了
- 凡是部署了 iterator 接口的数据结构也都可以使用数组的 扩展运算符(…)、和解构赋值等操作
for…in 的特性
- 遍历的是对象的值,并且会遍历到原型链上去,可以通过两种方法解决
- 通过 hasOwnProperty 去判断是否是自身对象的属性
- 通过在原型上添加属性时,加上配置,让该添加的属性不可枚举,这样 for…in 就不会被遍历到了
const obj = { a: 1, b: 2, c: 3 }
for (let item in obj) {
console.log(item)
}
for (let item of obj) {
console.log(item)
}
let obj = {
name: "Joker_Peng",
age: 22,
job: 'Engineer',
[Symbol.iterator](){
let self = this
let keys = Object.keys(self)let index = 0
return {
next(){
if(index < keys.length){
return {
value: self[keys[index++]],
done: false
}
}else{
return { value: undefined, done: true }
}
}
}
}
}
for(let item of obj) {
console.log(item)
}
let arr = [1,2,3,4]
Array.prototype.a = 5
for(let item in arr){
console.log(item)
}
for(let item in arr){
if(!arr.hasOwnProperty(item)) continue
console.log(item)
}
Object.defineProperty(Array.prototype, "b", {
value: 6,
enumerable: false
})
for(let item in arr){
console.log(item)
}