• 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
     
  • 相关阅读:
    Java 线程池学习
    Java线程:新特征-线程池
    创建Java线程池
    JAVA-线程安全性
    java线程安全总结
    栈和队列
    历年题目
    蓝桥杯算法训练
    hdu2083 暴力水
    poj 2299
  • 原文地址:https://www.cnblogs.com/eret9616/p/11261564.html
Copyright © 2020-2023  润新知