目录
- 在ES6中 我们学过了 ...拓展运算符 拓展运算符能拓展的 是带有iterator迭代器的数据
iterator迭代器的用法
-
//1.创建迭代器对象 //具备迭代器的数据 都会有一个方法 Symbol.iterator //这个方法的返回值是 迭代器对象 //因此 我们这里 就获取返回值 得到迭代器对象 let 迭代器对象变量名 = 具备迭代器的数据[Symbol.iterator]() //2.迭代器对象 具备一个方法 next 可以一步一步的循环指定的数据 //next方法 会将迭代器对象 循环出来的值 返回出来 console.log(迭代器对象变量名.next()) //{value:本次循环的结果,done:数据循环是否结束 结束为true 没结束为false}
迭代器的语法糖
for of for(let 值变量 of 要循环的数据(带有迭代器)){ //循环体代码 //值变量 就表示 每一次 迭代器循环出来的结果 }
给对象部署迭代器
//什么是迭代器呢 其实迭代器 就是一个方法 Symbol.iterator 数据调用这个方法 就可以生成迭代器对象从而实现 循环效果 //对象本身 没有这个方法 我们如果想给对象部署迭代器 其实就是给对象添加这个方法 //为了让所有对象 都能用到迭代器方法 我们将迭代器方法Symbol.iterator 添加到原型链的终点 Object.prototype Object.prototype[Symbol.iterator] = function(){ //this--->被循环的对象 let that = this; //获取到被循环的对象中 所有的属性值 let valArr = Object.values(this);//valArr就是被循环的对象中的所有属性值组成的数组 //声明一个变量 记录当前索要循环的索引 let idx = -1 //这个方法 应该返回一个迭代器对象 let iterator = { //迭代器对象中具备一个方法 next 用来循环指定数据 next(){ idx++; //next方法返回了一个对象——{value:本次循环的属性值,done:false/true} if(idx<valArr.length){ return { value:valArr[idx], done:false } }else{ return { value:valArr[idx], done:true } } } } return iterator; } let obj = { name:"张三", age:18 } let it = obj[Symbol.iterator](); console.log(it.next()); console.log(it.next()); console.log(it.next()); for(let val of obj){ console.log(val) } console.log(...obj) let obj1 = { name:"李四", age:19, gender:"男" } console.log(...obj1)