1、set 集合类似一维数组 传入一维数组初始化一个set集合 'new Set([1,2,3])'
set 的值可以是非字符串类型
有 has() clear() delete() add() forEach() .size
forEach() 方法的参数是一个函数 ,函数的参数有三个,前两个是一样的,表示迭代的值,'forEach((value,value,set)=>{})'
set集合的值不能重复
通过'arr=[...set]' 展开表达式可以将set集合迭代后打散放到数组中
weakSet 集合是 Set 集合的子集 只能存对象 是弱引用对象 当其它地方没有这个对象的引用之后 weakSet 中的这个对象会自动被垃圾回收
map 集合类似一个二位数组 传入一个二维数组初始化 一个map集合 'new Map([[key,value],[key,value]])'
key value 可以是非字符串类型
有 has() clear() delete() size forEach() get() set()
forEach((key,value,map)=>{})
weakMap集合的键必须是对象 这个对象也是弱引用的 当没有其它引用的时候 这个weakMap中会删除这个 'key,value' 对
2、迭代器 就是 用 next() 方法 返回 '{value:xxx,done:true/false}' 的对象 当有下一个值的时候 done为false 到没有值了 'done'就为true 以后再执行 next() 都是 '{value:undefined,done:true}'
生成器 就是 有'*' 定义的函数 函数体里面用多个 'yield' 定义分隔 每次迭代器执行的代码段 'function *fn(){yield 123}' 返回值就是一个迭代器 'xxx = fn(); xxx.next()'
'yield' 只能在生成器中使用
可迭代对象就是有实现 Symbol.iterator 属性的对象 这个 [Symbol.iterator] 的值应该是一个生成器 调用之后返回一个迭代器 给外部使用
Array 有默认的迭代器
'a=[1,2,3]; a[Symbol.iterator]().next() 输出 '{value:1,done:false}''
创建可迭代对象 就是实现一下接口 'o={*[Symbol.iterator](){yield 123}} for(x of o){ console.log(x)} 输出 123'
内建迭代器 就是除了默认迭代器[Symbol.iterator] 还创建了别的迭代器 比如 set.keys() map.values() array.entrities()
字符串迭代器 是按照字符位置来迭代 额不是码位 可以正确迭代占位好几个码位的字符
NodeList迭代器 document.getElementsByTagName() 的NodeList 可以用 for of 来迭代
展开运算符'[...set]' 是根据对象的迭代器来把对象展开的
迭代器传参 传入的参数会替代上一次 'yield 的值' 传入
迭代器抛错 迭代器除了next() 还有 throw() 可以往里面抛错误 然后 生成器能捕获这个错误 来决定下一次迭代什么
生成器返回语句 生成器中 用 return 来让 迭代器的迭代结束 '{value:return的返回值,done:true}'
委托生成器 就是在生成器中插入别的生成器 串联在一起 构成迭代器的每一次迭代 'function*a(){yield *b() yield *c()}'
异步任务执行 不确定任务什么时候执行 可以用迭代器来执行 当一次任务执行结束 就 next() 来执行下一个任务
3、类 'class A {constructor(){}} '
表达式 'let A = class B {}' 只能用 A 来创建类
类可以做函数的参数 返回值 可以赋值给变量
类 可以定义访问器属性 { get name (){}; set name (){}}
类可以使用可计算的成员名称 { [name](){} }
类可以定义生成器成员 {*xxx(){yield 123}}
类可以定义静态成员 { static xxx(){} }
类的继承 ' class A extends B { constructor(){ super()}}' A 是 B 的派生类
派生类可以重写父类中的方法 派生类可以拷贝父类的静态成员
一个函数表达式只要有 [[constructor]] 就可以被子类继承 比如 'function xxx (name) { this.name = name}'
内建对象 Array 可以被继承 应为内建对象定义了 [Symbol.species] 属性 所以 子类的[Symbol.species] 总返回构造函数
子类还是父类中 原属性 'new.targte' 始终返回 new 调用的类 可以用来在抽象类中组织抽象类被实例化