001|JavaScript ES6新特性之Symbol

作者: 中年小钢炮 | 来源:发表于2017-05-29 00:43 被阅读100次

    Symbol

    symbol是JavaScript中的一种基础数据类型(primitive types)。而Symbol()是一个函数,用于创建symbol类型的对象。

    Symbol([description]) // description参数只是一个便于调试的标记,没有其它任何用处。

    Symbol创建symbol类型对象时不可与new共用,直接调用即可:

    var symbolObject1 = Symbol()
    var symbolObject2 = new Symbol() // 此行报异常,Symbol is not a constructor
    

    Symbol()函数每次调用都会创建一个独一无二的symbol类型对象

    var result = (Symbol('David') == Symbol('David'))
    console.log(result) // 输出false
    

    将symbol对象作为对象属性key的时候,这个属性也是隐藏的(non-enumerable),无法用for...in来遍历。通过一段代码来理解一下:

    var symKey = Symbol.for('David')
    
    var student={}
    student[symKey]='James'
    
    console.log(student[symKey])
    for(var item in student){
        console.log(student[item])
    }
    

    全局符号表

    全局符号表(Global Symbol Registry),是一个key-value结构,key是任意对象,value是symbol对象。可以通过Symbol.for、Symbol.keyFor两个函数来操作全局符号表。

    Symbol.for(key);

    在全局符号表中寻找名字为key的symbol对象,如果找到则返回这个对象;如果没找到,则创建一个新的symbol对象。

    说简单一点,对于Symbol.for只要参数key相同,那么回返的symbol对象就相同。通过下面的例子来理解一下。

    Symbol.for('David')
    var result = (Symbol.for('David')==Symbol.for('David'))
    console.log(result) // 输出 true
    

    Symbol.keyFor是Symbol.for的逆操作。

    Symbol.keyFor(sym)

    sym是一个symbol对象,根据sym返回对应的key。如果不存在,则返回undefined.

    var symObj = Symbol.for('David')
    console.log(Symbol.keyFor(symObj)) // 输出 David
    

    其它Symbol操作

    Object.getOwnPropertySymbols()可以返回一个对象中所有的symbol对象key。

    Object.getOwnPropertySymbols(obj)
    

    好了,这一节就到这里。

    什么是Iterable Protocol & Iterator Protocol?

    相关文章

      网友评论

        本文标题:001|JavaScript ES6新特性之Symbol

        本文链接:https://www.haomeiwen.com/subject/lrtcfxtx.html