当前位置: 首页 > news >正文

外贸网站外贸网站建设行吗安顺网站建设公司

外贸网站外贸网站建设行吗,安顺网站建设公司,网站建设策略阿里巴巴,国内展厅设计公司排名1.iterator 概念 ES6 添加了Map和Set。这样就有了四种数据集合,需要一种统一的接口机制来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部…

1.iterator 概念

ES6 添加了Map和Set。这样就有了四种数据集合,需要一种统一的接口机制来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成for...of遍历操作(即依次处理该数据结构的所有成员)。

总结:

  1. Iterator是一种针对不同类型数据结构的统一处理机制
  2. 数据类型上有Symbol.iterator属性,就可以对其进行for...of遍历;
  3. Symbol.iterator属性其实是一个函数
  4. 原生具备Iterator接口的数据类型:Array,Set,Map,String,函数的arguments对象
  5. 对象没有Iterator接口:要实现对象的Iterator接口,需要给对象添加Symbol.iterator函数并具有next方法(即for... of循环的遍历过程所有的所有过程)

2.iterator的作用

Iterator 接口的目的,就是为所有数据结构提供了一种统一的访问机制,即for...of循环(详见下文)。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。

3.for... of循环的遍历过程

  1. 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
  2. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
  3. 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
  4. 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
  5. 每一次调用next方法返回一个包含value和done两个属性的对象。
  6. value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束,done为false表示遍历结束。
        var it = makeIterator([1, 2, 3]);console.log(it.next());console.log(it.next());console.log(it.next());console.log(it.next());function makeIterator(arr) {var nextIndex = 0;return {next: function () {// 函数必须returnreturn nextIndex < arr.length ?{ value: arr[nextIndex++], done: false }: { value: undefined, done: true }}}}

4.Iterator 接口部署在数据结构的Symbol.iterator属性(重中之中)

换句话说就是一个数据结构只要具有Symbol.iterator属性(本身是一个函数),就可以认为是“可遍历的”(for...of)(重中之中不好理解多讲一遍)

5.理解Symbol.iterator属性

Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器对象(该对象的根本特征就是具有next方法。每次调用next方法,都会返回一个代表当前成员的信息对象,具有value和done两个属性。)。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性

(对象的Symbol.iterator属性,指向该对象的默认遍历器方法。)

const obj = {[Symbol.iterator] : function () {return {next: function () {return {value: 1,done: true};}};}};

6.原生具备iterator接口

ES6 的有些数据结构原生具备 Iterator 接口(比如数组),即不用任何处理,就可以被for...of循环遍历。原因在于,这些数据结构原生部署了Symbol.iterator属性,另外一些数据结构没有(比如对象)。凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。

原生具备 Iterator 接口的数据结构如下。

  • - Array
  • - Map
  • - Set
  • - String
  • - 函数的 arguments 对象(类数组/伪数组)
// 例如数组的Symbol.iterator属性。
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();console.log(iter.next());// { value: 'a', done: false }
console.log(iter.next());// { value: 'a', done: false }
console.log(iter.next());// { value: 'a', done: false }
console.log(iter.next());// { value: undefined, done: true }

7.arguments对象理解

arguments对象不是一个 Array 。它类似于Array,但除了长度之外没有任何Array属性。例如,它没有 pop 方法。

但是它可以被转换为一个真正的Array:(arguments转为真正的数据,ES5用slice()方法,ES6扩展运算符)

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
function get(a,b,c){console.log(arguments);console.log(Array.from(arguments)); // [1,2,3] 实参return a+b+c
}get(1,2,3)

8.对于原生部署 Iterator 接口的数据结构

对于原生部署 Iterator 接口的数据结构,不用自己写遍历器生成函数,for...of循环会自动遍历它们。

除此之外,其他数据结构(主要是对象)的 Iterator 接口,都需要自己在Symbol.iterator属性上面部署,这样才会被for...of循环遍历。

9.对象不具备Iterator 接口

原因:对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。

如果对象想具备Iterator 接口需要自己在Symbol.iterator属性上面部署,这样才会被for...of循环遍历。

10.大厂笔试题:自己实现...obj的Iterator接口遍历

这里只是自定义实现给对象添加Iterator接口,实际上ES6语法中对象没有实现Iterator接口的,所以对象不能调用for...of进行遍历

给自身obj一个Symbol.iterator函数;

给定遍历顺序,此处为data.length的不断递进。这里遍历的数据里面数据特殊data也是数组,直接使用self.data.length就可以判断数据被循环完,如果是真的对象let obj = { a:1, b:1}就不能使用这种方式判断,可以使用Object.keys(obj).length,Object.entries()等进行判断和处理

        let obj = {data: [ 'hello', 'world' ],[Symbol.iterator]() {const self = this;let index = 0;return {next() {if (index < self.data.length) {return {value: self.data[index++],done: false};} else {return { value: undefined, done: true };}}};}}for (let value of obj) {console.log(value);}
        let obj = {a: 1,b: 2,[Symbol.iterator]() {const self = this;let index = 0;// console.log(this);let len = Object.keys(this).length;let entries = Object.entries(this);return {next() {if (index < len) {return {value: entries[index++][1],done: false};} else {return { value: undefined, done: true };}}};}}for (let value of obj) {console.log(value);}

http://www.yayakq.cn/news/610379/

相关文章:

  • seo网站推广技术如何制作网站设计
  • 即商通网站建设推广wordpress工作室
  • 合肥做机床的公司网站网站建站建设网站
  • 网站建设运用的技术合肥建设学校官网网站
  • 做外贸哪些网站可以发布产品做个简单的网站多少钱
  • 网站图片规格wordpress 应用商店模板
  • 网站建设的定位是什么零成本搭建自己的网站
  • 兰州网站建设多少钱张掖做网站公司
  • 十元精品店做网站沙井网站优化
  • 上海私人做网站网站怎么做视频教程
  • 怎么用ftp清空网站wordpress word上传图片
  • 罗湖商城网站设计制作wordpress相关网站
  • 网站域名使用方法北京搬家公司哪家最好
  • 蓝山网站建设打开部分网站很慢
  • 经营网站赚钱做外国人的生意哪家网站好
  • 宁波网站建设内容wordpress 获取分类名称
  • 做期货在哪个网站看消息长沙网站制作推广
  • 网站邮箱接口怎么设置建设租房子的网站
  • 食品饮料网站建设中国最新光刻机
  • 如何做网站 写代码青岛网站建设工作室
  • 西安网站建设官网wordpress 只需输入姓名
  • 浙江网站建设公司地址国外的电商网站有哪些方面
  • 网站制作关键字排名二手购物网
  • 上海正规做网站公司有哪些温州做网站就来温州易富网络
  • 多语言企业网站模板手机wordpress写博客
  • 建立网站和推广学校网站怎么建设视频
  • 从音乐网站下载歌曲做铃音要收费吗深圳文化墙设计公司
  • 电脑做h5比较好的网站网站建设宣传ppt模板下载
  • 高端网站建设需要多少钱网站开发项目规划
  • 网站建设捌金手指花总二六最新网站建设方案