ES6深入浅出-2 新版函数:4 迭代器与生成器-3.生成器 & for...of

迭代器平时用的很少。但是如果你是写框架的,你会经常用到迭代器。

生成器是专门用来做迭代器的东西

发布器是要产生一个叫做next的对象,如果你要产生这种对象。就可以使用ES6新出的语法。

ES6的新语法

星号放在哪里都可以,甚至打空格可以了。

这样写也行

这样写也行

while(true)是一个死循环。这是一个ES6的语法糖

function*是什么 yield是什么鬼?ES6难理解,就是你永远用不到的东西,在这个基础之上又加了一个你永远用不到的东西。
可以移植运行a.next()理论上不会结束。


这段代码只会运行一次,但是在yield这里发生了变化。yield就是吼出去。

每次进入下一次循环,让一下。

yield这里有一出一进的感觉。出来把value的值改变。然后调用next又进去。继续走true的判断。

当运行了a=发布器().

现在version是1. 它等着你去调用next方法,让它继续。
调用next方法它会这个version吼出来 就是1.

同时它继续执行到后面。这个时候version等于2。这个循环被我们终端了。你只要不调用next它就不会继续下一个。每次next就会循环一次。这就是迭代器的语法糖。

函数没有return 什么,只需要把每次迭代的值yeild出来即可,

那么这个yield有什么用呢????并不觉得你在1到2年内会用到它 ,但是还是要背下来。所以ES6是很难学的,你必须要写很多代码才会遇到要用迭代器的机会。
生成器是迭代器的语法糖。

for of

for of是迭代器访问的语法糖
可迭代的对象就是可以移植调用.next的对象。

定义一个数组,调用next方法,但是报错了。说明不能迭代

用for of 遍历array这个数组。

用for循环遍历正常遍历数组

如果给array添加一个属性,如果叫做x,x的值是y。当前的array是下面这个

那么在遍历的时候,该不该打出x的值呢?

定义另外一个object对象。

array的keys没有数字下标。所以你的遍历不知道是什么,你以前的遍历都是狭义的遍历。如果是数组就只看012345这种数字的下标。如果是对象,我就全部都看。

把对象编程数组,现在这个object和这个对象一模一样。

object现在是一个数组了。

object和array现在是一样的。对象和数组目前已经一模一样了。如果他们一样为什么他们的遍历是不一样的?

ES5里面下面这四种类型都是对象,一种特殊的对象。简化的说就是数组是一种对象。

可迭代对象,,有些对象是可以的迭代的,比如数组。

array和object都可以遍历。但是只有array可以迭代。对象不能迭代。

为什么对象不可以迭代呢?如果一个东西可以被for of使用,它就可以迭代的

key in 这种是以前的语法。

这都是在遍历。

for of是新的语法

迭代object。提示错误,对象不可迭代

数组和对象是同一种东西,只是理解方式不同。这就涉及到ES5的内核了。


遍历的时候for循环,是自己骗自己数组是有顺序的 ,实际上数组array是没有顺序的。

数组和对象到底有什么区别??
数组的原型指向Array.prototype
对象的原型执行Object的prototype

没什么区别,只是原型不同而已。

只有符合某些特征的对象才可以迭代,数组自带了迭代的功能。

数组有这个属性

object没有这个属性。

能不能迭代的根本原因就是它定义了一个迭代的方法。
把不能迭代的Object变成可迭代的行不行?现在object是不可迭代的

定义个迭代器,这个迭代器只要不停的yield值就可以了。

object就可以迭代了。

重新写迭代的方法。
先拿到所有的key

循环yield,这个对象的keys[i]

打印出来的还是不对的。

把pbject的值改一下

然后重新迭代的方法

再来迭代

为什么数组可以迭代,对象不能迭代呢?因为数组知道如何按顺序去访问。我只需要先访问第0项,再访问第1项,你每次调用next我都访问数组的下一项就可以了。但是object不行,因为它不知道如何去访问你这些key,是先给你a啊?显示先给你b啊 显示还给你c呢?

为什么通过keys就可以拿到了呢???注意这个顺序是不确定的。有可能你换个浏览器就不是abc了。由不可迭代变成可迭代,你只要告诉它怎么迭代就可以了。

Symbol是一个独一无二的值,这里如果不发明Symbol语法。这里的语法就是扯淡。这是Symbol引入ES6最开始的意义就是为了实现迭代器。

结束

原文地址:https://www.cnblogs.com/wangjunwei/p/11816160.html

时间: 2024-08-30 07:30:12

ES6深入浅出-2 新版函数:4 迭代器与生成器-3.生成器 & for...of的相关文章

ES6深入浅出-2 新版函数:4 迭代器与生成器-1.字面量增强

今天的内容 字面量literal 写出来就是它的值 例如字符串hello.这就是自变量. 一个空对象,也是自变量 写出来就是代表它写出来的那个意思就是自变量. 与其相反的就是构造出来的.例如下面的new Object()就不是自变量. 非自变量就是构造出来的量 二进制 以前的二进制是怎么写的呢 以前的二进制基本没有什么用 十进制没有十 八进制没有八 二进制,是以0b开头的 es6新语法,以0b开头的是二进制.0o开头的是八进制 在es5里面0777代表是八进制. 新版的语法知识更好的理解而已.

ES6深入浅出-2 新版函数:4 迭代器与生成器-4.总结

yield的值就是外面调用next得到的值 ES6给的新的语法,如果你给任何一个对象添加一个Symbol.interator的key,同时它的值是一个生成器. 下面选中的就是生成器.生成返回的东西是迭代.那么这个对象就可以迭代,就叫做可迭代对象. 现在JS有三种for语法. 1:叫做for循环 2:遍历一个对象, 3:迭代 结束 原文地址:https://www.cnblogs.com/wangjunwei/p/11816210.html

ES6深入浅出-2 新版函数:箭头函数 2 视频-1.视频 箭头函数

ES3里面的写法 匿名函数是用不了的 还是需要给他赋值 选中的这一部分叫做匿名函数 等于号叫做赋值 let xxx叫做声明 所以说这个地方是三个语法,首先声明一个匿名函数,然后声明一个xxx变量,最后把这个匿名函数赋值给这个变量xxx es6箭头函数 箭头函数只能做赋值,不能做声明 这是一个标准的箭头函数 写法2,只有一个参数 如果只有一个函数,可以不用写括号 调用一下做测试 写法3,函数体只有一句话的情况 如果函数体只有一句话,那么是可以不写花括号的. 假设我们的函数体只有return p1+

ES6深入浅出-2 新版函数:箭头函数 2 视频-2.视频 箭头函数杂谈

杂谈coffeescript 箭头函数抄的是谁? coffeescript 双箭头的形式 箭头函数简洁的语法 数组内每一个值都平方一下 Map的写法 箭头函数的写法 平方后,每一个值再加1 number变量改成用n,更简化 瘦箭头 瘦箭头其实就是function 判断response里面的对象是否存在的情况 coffescript里面的解决方法,直接用问号解决了. vue中说不要使用箭头函数? 因为vue中依赖this 用到了箭头函数就别用this function()简写的写法,onClick

ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const

以前的var方式声明不好用 a=1回声明一个全局变量, 输出了1 说明a=1确实声明了一个全局变量. 但是你把放在其他的地方,就不是声明全局变量了. 如果外面有个全局变量a 那么函数里面就是给a赋值 有两层函数的时候,直接使用的是局部变量a,也就是fn函数里面的a 如果当前没有a就声明一个全局变量a.如果有a就利用这个a.下面当前就是有a的 这样用的就是最外面的var a 如果外面也没有,这时候才会去声明一个全局变量 所以a=1会声明一个全局变量是错的,只有在没有a这个变量的情况下才会隐式的去声

ES6深入浅出-5 新版对象-1.如何创建对象

对象属性的加强: 可以通过new Object(), Object.create()方法,或者使用字面量标记(初始化标记)初始化对象. 一个对象初始化器,由花括号/大括号 ({}) 包含的一个由零个或多个对象属性名和其关联值组成的一个逗号分隔的列表构成. 上面那句话说的是如何产生一个新的对象. 下面代码.a就是一个空对象, 空对象只有一个属性.那就是_proto_ 使用object.create去创建对象,需要传个参数,这里传null.就真的是一个空对象了,里面什么都没有 Object.crea

ES6深入浅出-5 新版对象-2.属性修饰符

对象语法增强 已经有了个对象的新增语法 还需要一个api来做呢?. 因为有的时候,你需要在旧的对象上添加get.set. 读的时候就走get 写的时候就走set 假设很早之前在项目里写了一个old对象,它的属性都是写好的,现在想给oldObject加get.set.没有办法再去重新定义它 这个api是给已经定好的对象,来不及再去重新定义的对象修改属性, 这样就可以设置oldObject的值为1. 但是set方法里面什么也没做.所以输出oldObject.x的值为undefined 这个api还有

ES6深入浅出-7 新版的类(上集)-1.介绍原型

ES6新出的关键class BE受雇与网景开发了JS 当我们在写一个对象的时候,我们实际上内存的形式表示. obj等于一个空对象,可以直接toString.它为什么可以有toString window是一个全局的对象. window下有个object的属性. 通过window.Object.prototype找到了toString 为了方便理解,当说原型的时候 先理解为共用属性. toString是很多对象的共用属性. 当谢var obj为一个空对象的时候,为什么可以获取到toString的方法

ES6深入浅出-8 新版的类(下集)-1.简单语法

回顾 当你声明一个空的对象obj的时候,会生成一块内存这个内存里面什么都没有,自由__proto__存在401的地址. 也就是Object的protototype在内存中的地址 类 通过函数创建类.这就是构造函数的由来. 用函数来创建某一类的对象,这个函数就叫做构造函数. 公有属性和私有属性 class constructor用来构造自有属性. 公有属性     p1的walk和p2的walk是同一个walk 复杂语法 类必须用new去创建. this就是p1这个对象 extends psers