Symbol
- ES6新增的数据类型
Symbol
- 创建Symbol:通过去全局的
Symbol
函数创建一个Symbol
,Symbol
函数接受一个可选参数,用于添加一段文本描述即将创建的Symbol
,方便阅读和调试Symbol程序
let firstName = Symbol('first name');
let person = {};
person[firstName] = 'Nicholas';
console.log('first name' in person); //false
console.log(person[firstName]); //'Nicholas'
console.log(firstName); //'Symbol(first name)'
- ES6扩展了
typeof
操作符,支持返回Symbol
,可以用typeof来检测变量是否为Symbol
类型.
Symbol共享体系
- ES6提供了一个可以随时访问的全局Symbol注册表,如果要创建一个可共享的Symbol,要使用Symbol.for()方法,该方法只接受一个参数,就是即将创建的Symbol的字符串标识符
let uid = Symbol.for('uid');
let object = {};
object[uid]='12345';
console.log(ojbect[uid]);
console.log(uid);
- Symbol.for()方法首先在全局Symbol注册表中搜索键为'uid'的Symbol是否存在,如果存在,直接返回已有的Symbol;否则创建一个新的Symbol,并使用这个键在Symbol全局注册表中注册,随即返回新创建的Symbol
- 可以使用
Symbol.keyFor()
方法在Symbol全局注册表中检索与Symbol有关的键
let uid = Symbol.for('uid');
console.log(Symbol.keyFor(uid)); //'uid'
let uid3 = Symbol('uid');
console.log(Symbol.keyFor(uid3)) //undefined
Symbol属性检索
- ES6中新增
Object.getOwnPropertySymbols()
方法来检索对象中的Symbol属性,返回值是一个包含所有Symbol自由属性的数组
let uid = Symbol.for('uid');
let object = {
[uid]: '12345'
};
let symbols = object.getOwnPropertySymbols(object);
console.log(symbols.length); //1
console.log(symbols[0]); //'Symbol(uid)'
console.log(object[symbols[0]]) //'12345'