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?