Symbol
Symbol是由ES6规范引入的一项新特性,它的功能类似于一种标识唯一性的ID
let s = Symbol()
需要注意,不需要 new 关键字
调用Symbol()函数时传入一个可选的字符串参数,相当于给你创建的Symbol实例一个描述信息:
let s = Symbol('description')
每个Symbol实例都是唯一的。当比较两个Symbol实例的时候,将总会返回false:
let s1 = Symbol('description')
let s2 = Symbol('description')
s1 === s2 //false
应用场景
- 使用Symbol来作为对象属性名(key)
const prop = Symbol()
let obj = {
[prop]: 18
}
obj[prop] // 18
另一个需要注意的是, Symbol类型的key是不能通过Object.keys()或者for…in来枚举的, 这时可以用Object的API
Object.getOwnPropertySymbols(obj)
- 使用Symbol来替代常量
先来看一下下面的代码
const TYPE_OLT = 'OLT'
const TYPE_BRAS = 'BRAS'
function switchType(type) {
switch(type) {
case TYPE_OLT:
// do something
break
case TYPE_BRAS:
// do something
break
default:
// do something
}
}
现在有了Symbol,可以不必关心具体值, 只需要保持唯一性:
const TYPE_OLT = Symbol()
const TYPE_BRAS = Symbol()
- 注册和获取全局Symbol
let gs1 = Symbol.for('global_symbol_1') // 注册一个全局Symbol
let gs2 = Symbol.for('global_symbol_1') // 获取全局Symbol
gs1 === gs2 // true
这样一个Symbol不光在单个window中是唯一的,在多个相关window间也是唯一的了。