iterator(迭代)一般很少直接使用, 但是却是很常用很重要的功能.
例如 :
对象的扩展运算符(...)内部其实是调用了 Iterator 接口。
在es6 中统一了遍历的接口 Iterator,Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环。
字符串也可以使用扩展运算符
rest运算符, 与扩展运算符是逆运算
扩展运算符:数组=>分割序列
rest运算符:分割序列=>数组
rest可以代替arguments变量
回到主题, 迭代
Symbol.iterator 为每一个对象定义了默认的迭代器。
当需要对一个对象进行迭代时(比如开始用于一个 for..of 循环中),它的 @@iterator 方法都会在不传参情况下被调用,返回的 迭代器 用于获取要迭代的值。
一些内置类型拥有默认的迭代器行为,其他类型(如 Object )则没有。下表中的内置类型拥有默认的 @@iterator 方法:
更多信息请参见 迭代协议 。
js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symbol.iterator] 函数
这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错.
for of 传入的是可迭代对象,但是如何吧一个不可迭代的对象变为可迭代的对象呢!很简单就是自己写一个[Symbol.iterator]函数。
你以为迭代就这么简单的结束了吗?现在再讲一个新东西 yield
. yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
. yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别代表返回值和是否完成。
. yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。
用 yield 自定义一个迭代器
function* () {} 这种函数名字叫 generator函数, 生成器函数, 下一篇再重点讲这个哈.
ES6 一共有 5 种方法可以遍历对象的属性。
(1)for...in
for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
(2)Object.keys(obj) ie9
Object.keys 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
(3)Object.getOwnPropertyNames(obj) ie9
Object.getOwnPropertyNames 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols 返回一个数组,包含对象自身的所有 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys 返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。
其中兼容性最好的是for... in来进行遍历,因为我们通常只需要遍历对象自身拥有的属性 所以使用 Object.prototype.hasOwnProperty() 兼容到ie5.5 方法来排除继承的属性
注意:即使属性的值是 null 或 undefined ,只要属性存在, hasOwnProperty 依旧会返回 true 。
如果不在意兼容性问题,用keys方法,搭配for... of来遍历也不错,、
for...of是es6引入的用于遍历可迭代对象的语法,相当于python里的for in。
js的for...in别扭的地方在于,遍历数组和对象都是返回的key值,遍历数组是下标值。for...of遍历数组会返回每一个值,跟foreach类似的效果,但是对于对象,只支持实现了迭代器的对象。
Map映射是ES6里面新增的一个对象,是一组键值对的结构,具有极快的查找速度。Map是类似Object的一种键值对集合,区别在于Map的键不仅限于是字符串,其他各种类型的值包括对象都可以成为Map的键
Set也是ES6新增的对象,Set是一组key的集合,但不存储value, 而且key不重复,可自动排重
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
原文链接: https://blog.csdn.net/hot_cool/java/article/details/83685046