目录
iterator
for...of循环迭代器
可枚举/不可枚举
属性描述对象
示例
对象属性遍历的方式
在JavaScript中,迭代器是一个对象,它提供了一种按顺序访问集合元素的方法,而不暴露集合结构的底层细节。
可遍历的数据类型:Array、String、Map、Set或者其他具有Symbol.iterator属性的对象,obj[Symbol.iterator]是一个迭代器生成函数,返回一个迭代器iterator。
迭代器具有一个方法next,iterator.next() 返回的对象结构{ value: value , done: boolean };
// Custom iterable object
const myIterable = {
data: [1, 2, 3, 4],
[Symbol.iterator]: function () {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { done: true };
}
},
};
},
};
// Using the iterator
const iterator = myIterable[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { done: true }
底层遍历,每次返回迭代器对象next() 的value
for(value of myIterable){
console.log(value) //1 2 3 4
}
...扩展符号, 扩展的原理其实就是底层调用迭代器
console.log([...myIterable]) // [1, 2, 3, 4]
可枚举和不可枚举通俗点来说是可以被for...in循环遍历出来的属性就称做可枚举属性,不能被其遍历出来的属性就称做不可枚举属性,但是严谨解释就是,每一个对象属性都具有“属性描述对象”
属性描述对象是一个包含有关 JavaScript 对象属性特性的对象。在属性描述对象中,包含了属性的各种信息,如是否可枚举、是否可写、是否可配置等。
对象描述属性由Object.getOwnPropertyDescriptor方法返回。
属性描述对象包含以下属性:
其中enumerable就表示这个属性是否可被枚举
1. 创建一个对象,添加属性,for...in遍历属性
const obj = { a: 1, b: 2 };
// 添加一个属性,默认是可枚举的
obj.c = 3;
for (const key in obj) {
console.log(key); // 输出 a, b, c
}
2. 创建一个对象,添加不可枚举属性,for...in遍历属性,不可枚举不被遍历
const obj = { a: 1, b: 2 };
// 添加一个属性,默认是可枚举的
obj.c = 3;
// 使用 Object.defineProperty 将属性设置为不可枚举
Object.defineProperty(obj, 'd', {
value: 4,
enumerable: false,
});
for (const key in obj) {
console.log(key); // 输出 a, b, c
}