Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    A Review of ES6 - Symbol Type, Iterators, Generators

    Published Oct 11, 2019 [  Node.js  ]

    Symbol Type

    Symbol Type

    Unique and immutable data type to be used as an identifier for object properties. Symbol can have an optional description, but for debugging purposes only.

    Symbol("foo") !== Symbol("foo")
    const foo = Symbol()
    const bar = Symbol()
    typeof foo === "symbol"
    typeof bar === "symbol"
    let obj = {}
    obj[foo] = "foo"
    obj[bar] = "bar"
    JSON.stringify(obj) // {}
    Object.keys(obj) // []
    Object.getOwnPropertyNames(obj) // []
    Object.getOwnPropertySymbols(obj) // [ foo, bar ]
    

    Global Symbols

    Global symbols, indexed through unique keys.

    Symbol.for("app.foo") === Symbol.for("app.foo")
    const foo = Symbol.for("app.foo")
    const bar = Symbol.for("app.bar")
    Symbol.keyFor(foo) === "app.foo"
    Symbol.keyFor(bar) === "app.bar"
    typeof foo === "symbol"
    typeof bar === "symbol"
    let obj = {}
    obj[foo] = "foo"
    obj[bar] = "bar"
    JSON.stringify(obj) // {}
    Object.keys(obj) // []
    Object.getOwnPropertyNames(obj) // []
    Object.getOwnPropertySymbols(obj) // [ foo, bar ]
    

    Iterators

    Iterator && For-Of Operator

    Support “iterable” protocol to allow objects to customize their iteration behavior. Additionally, support “iterator” protocol to produce sequence of values (either finite or infinite). Finally, provide convenient of operator to iterate over all values of an iterable object.

    let fibonacci = {
        [Symbol.iterator]() {
            let pre = 0, cur = 1
            return {
               next () {
                   [ pre, cur ] = [ cur, pre + cur ]
                   return { done: false, value: cur }
               }
            }
        }
    }
    
    for (let n of fibonacci) {
        if (n > 1000)
            break
        console.log(n)
    }
    

    Generators

    Generator Function, Iterator Protocol

    Support for generators, a special case of iterators containing a generator function, where the control flow can be paused and resumed, in order to produce sequence of values (either finite or infinite).

    let fibonacci = {
        *[Symbol.iterator]() {
            let pre = 0, cur = 1
            for (;;) {
                [ pre, cur ] = [ cur, pre + cur ]
                yield cur
            }
        }
    }
    
    for (let n of fibonacci) {
        if (n > 1000)
            break
        console.log(n)
    }
    

    Generator Function, Direct Use

    Support for generator functions, a special variant of functions where the control flow can be paused or resumed, in order to produce sequence of values (either finite or infinite)

    function* range (start, end, step) {
        while (start < end) {
            yield start
            start += step
        }
    }
    
    for (let i of range(0, 10, 2)) {
        console.log(i) // 0, 2, 4, 6, 8
    }
    

    Generator Matching

    Support for generator functions, i.e., functions where the control flow can be paused and resumed, in order to produce and spread sequence of values (either finite or infinite).

    let fibonacci = function* (numbers) {
        let pre = 0, cur = 1
        while (numbers-- > 0) {
            [ pre, cur ] = [ cur, pre + cur ]
            yield cur
        }
    }
    
    for (let n of fibonacci(1000))
        console.log(n)
    
    let numbers = [ ...fibonacci(1000) ]
    
    let [ n1, n2, n3, ...others ] = fibonacci(1000)
    

    Generator Methods

    Support for generator methods, i.e., methods in classes and on object, based on generator functions.

    class Clz {
        * bar () {
            
        }
    }
    let Obj = {
        * foo () {
            
        }
    }
    

    References: