symbol,iterator,generator (一)

一、对全局Symbol的介绍:
 
symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复、唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的。
 
 
symbol.for与symbol.keyfor:
 
let a = Symbol.for(‘123’)    // 123是key , 123为key注册一个symbol

let b = Symbol.for(‘123’)    // 123是key , 123为key注册一个symbol

a == b // true

(在全局用这个key来registry)

Symbol.for是这样工作的, 先搜索全局用这个key注册的Symbol,如果没有,用key在全局注册一个Symbol

Symbol.keyfor搜索全局Symbol registry,找到这个Symbol的key

Symbol.keyfor(a) //123

Symbol.keyfor(b)  //123

 
 
 
二、iterator(迭代器)、generator(生成器函数)
 
 
有一些JS对象内部(或原型链上)有[Symbol.iterator]属性,该属性实现了一个符合iterator protocol的方法,以此,我们称该JS对象是可迭代(iterable)的
(常见的,如for...of就是在调用迭代方法),实现了这些方法的对象包括数组、类数组对象(函数的arguments对象)、(普通对象没有实现[Symbol.iterator])
 
 
 
1.可迭代的   (iterable protocol:如果一个对象有[Symbol.iterator]属性,并且该属性的value是一个迭代器(iterator),那么这个对象是可迭代的(iterable)
 
 
3.迭代器     (iterator protocol:如果一个对象内部有一个next方法,该方法是无参的,并返回一个有value属性和done属性的对象,那么这个对象是一个迭代器
 
(注:结合2和3,可知,如果一个js对象有[Symbol.iterator]属性,并且该属性的value是一个迭代器,那么这个对象是可迭代的)
 
 
 
4.生成器(生成器函数)(generator function:生成器(生成器函数)会生成一个生成器对象(generator object),生成器函数用function* expression 来声明,内部可以进行yield和return操作
 
生成器对象(generator object):生成器对象由生成器生成,并且是可迭代(iterable)的,这种对象满足了iterable protocol  ,(也就是说generator object内部(或原型上)有[Symbol.iterator]属性,这个属性对应的值是一个对象,对象有一个next方法,该方法是无参的,并返回一个有value属性和done属性的对象
 
!而且,在generator object 的原型上也挂载了next方法,可以直接调用这个next方法
 
 
证明这一点:
function* generator() {

yield 1
yield 2
yield 3

}


let generator_obj = generator()  // generator_obj是可迭代的


for (let i of generator_obj) {
console.log(i);                // 1 2 3 
}
 
 
 
 
 
 
资料:
- https://developer.mozilla.org/en-US/docs/Glossary/Symbol
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator
 
原文地址:https://www.cnblogs.com/eret9616/p/11261564.html