开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
前言
Undefined、Null、Boolean、Number、String 和 Symbol 是ECMAScript 有 6 种基本的数据类型。你肯定也注意到 Symbol(符号)。它是 ECMAScript 6 新增的。symbol 是原始值,且符号实例是唯一、不可变的。symbol 用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
使用场景:创建唯一记号。
用法
- 初始化
let sym = Symbol();
let bsym = Symbol('BBB');
使用Symbol()函数时,也支持传递一个字符串参数,用途是对符号的描述(description),将来可以通过这个字符串来调试代码。但是这个参数跟 symbol 没有任何关系。
- 只要创建就是一个唯一的记号
let asym = Symbol('nanlv')
let bsym = Symbol('nanlv')
console.log(asym==bsym) ; // 输出 false
从上面的代码中可以看到,只要创建 Symbol()实例并将其用作对象的新属性,就可以保证它不会覆盖已有的对象属性。注意点:它是不能与 new 一起使用的。
创建全局 symbol
场景:部分功能需要共享或者重用时,那么可以用一个字符串作为键,在全局符号注册表中创建并重用 symbol。
方法:使用symbol.for() 方法。symbol.for() 会先检查全局运行时注册表,如果不存在则创建一个 symbol 实例并将其添加到全局符号注册表中,如果存在则直接返回该 symbol 实例。
let asym = Symbol.for('nanlv')
let bsym = Symbol.for('nanlv')
console.log(asym==bsym) ; // 输出 true
如果仅使用 symbol() 初始化实例时不能和 Symbol.for() 的实例是不相等的。Symbol.for() 必须使用加上参数,即使用字符串键来创建。
查询symbol
使用 Symbol.keyFor()来查询全局符号注册表。通过接收参数为 symbol 类型,返回该 symbol 对应的字符串键,如果查询不到则返回 undefined
let s = Symbol.for('nanlv');
console.log(Symbol.keyFor(s)); // nanlv
console.log(Symbol.keyFor(s2)); // 报错 TypeError: s2 is not a symbol
Symbol.keyFor 仅对 Symbol.for() 方法创建的 symbol 实例才可以查找到,如果是 symbol()方法创建将返回 undefined。
symbol 属性
symbol 属性是对内存中符号的一个引用,所以无法通过 Object.keys 和Object.getOwnPropertyNames 返回,但是可以使用 Object.getOwnPropertySymbols 方法来返回对象所有的 Symbol 属性。
let sym = Symbol();
let obj = {
[sym]: "value"
};
console.log(obj[sym]); // "value"