例子:1
let arr = ['a','b','c'];
for(let i of arr){
console.log(`{for..of}arr: ${i}`);
//{for..of}arr: a
//{for..of}arr: b
//{for..of}arr: c
}
for(let i in arr){
console.log(`{for...in}arr: ${i}`);
//{for...in}arr: 0
//{for...in}arr: 1
//{for...in}arr: 2
}
for in
for in 的特点
- for ... in 循环返回的值都是数据结构的 键值名。
- 遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。
- for ... in 循环不仅可以遍历数字键名,还会遍历原型上的值和手动添加的其他键。如例子2
例子:2
const arr = ['a', 'b']
// 手动给 arr数组添加一个属性
arr.name = 'qiqingfu'
// for in 循环可以遍历出 name 这个键名
for (let i in arr) {
console.log(i)
// 0
// 1
// name
}
- 特别情况下, for ... in 循环会以看起来任意的顺序遍历键名。这是因为 ECMAScript规范中定义了 「数字属性应该按照索引值大小升序排列,字符串属性根据创建时的顺序升序排列。」
for in 循环特别适合遍历对象。
for of
for of 循环用来获取一对键值对中的值,而 for in 获取的是 键名。一个数据结构只要部署了 Symbol.iterator 属性, 就被视为具有 iterator接口, 就可以使用 for of循环。for of语句在可迭代对象上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。
for of遍历对象会报错,因为对象中没有迭代器
可迭代对象
每个可迭代对象都有迭代器iterator。迭代器中必须有next()方法。例子:
let test = {
from: 1,
to: 5
}
这是一个普通对象没有迭代器,接下来添加一个迭代器.
运行for...of时,首先执行的就是Symbol.iterator
test[Symbol.iterator] = function(){
return {
// 返回当前元素和目标元素
current: this.from,
// 当last = infinity时,迭代器会一直执行,使用break跳出循环
last: this.to,
// 用next方法让迭代器执行下去
next(){
// done 为true时 迭代结束
if(this.current <= this.last){
return {done: false,value: this.current++}
}else return {done: true}
}
}
}
iterator迭代器
js的symbol中有个iterator迭代器,它也是 一个接口,它有三个作用:1.它可以为数据结构提供访问接口 2.可为数据有序排列 3.可用于for of循环和...rest参数,它的工作流程是:1.创建一个指针对象,指向数据结构中的起始位置 2.调用next方法指向下一个数据,直到指向的数据没有时,结束位置。
Js中的可迭代对象
- Arrays数组
- 字符串Strings
- Map
- Set
- arguments
- Generators
- Nodelist对象, 就是获取的dom列表集合