JavaScript遍历
对象与数组
因为for…in遍历不仅仅遍历自身的属性,原型链上的所有属性都将被访问
const a=[2,3,4,123]
a.__proto__.name="张三"
for (let aKey in a) {
console.log(a[aKey])
}
/* 我本想打印的是数组a里面的值 结果将原型里面的属性name的值也打印出来了,这并非我是想要的。
2
3
4
123
张三
*/
//此时用for...of可以很好的解决这个问题
for (let aKey of a) {
console.log(aKey)
}
/*
2
3
4
123
*/
for…of遍历并非所有的对象都不能使用若有iterator接口就可以实现此遍历,有此接口的对象有 Map,Set对象等。
Iterator(遍历器)
概念
- 遍历器(Iterator)是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
作用
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列;
- ES6 创造了一种新的遍历命令
for...of
循环,Iterator 接口主要供for...of
消费。
原生具备iterator接口的数据结构为
- Array
- Map
- Set
- String
- TypedArray
- 函数的 arguments 对象
- NodeList 对象
具有遍历器可以使用的方法
for…of
const array=[]
for (let aKey of "string") {
console.log(aKey) ;
array.push(akey);
}
扩展运算符
const array=[..."string"];
判断是否存在遍历器
- 函数(Function ,未经过new实例化)
//例如Set函数
console.log(Set.prototype[Symbol.iterator])
//若不为undefined则存在遍历器
- 对象
const a="stirng"
console.log(a.__proto__[Symbol.iterator])
//若不为undefined则存在遍历器