001|JavaScript ES6新特性之Symbol

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)