1. Symbol类型
在 JavaScript ES6 中新增了一种基础数据类型 Symbol,它是一种唯一的、不可变的数据类型,提供了一种防止属性名冲突的解决方案。
Symbol 对象常量 是一组共享的标识符,可以用来创建具有唯一值的属性名。
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false
由此可以看出,每个新创建的 Symbol 都是唯一的,即使它们的描述字符串相同。
2. 隐藏属性
在 JavaScript 中,我们可以给对象添加属性,在 ES6 中提供了一种方法来将属性设置为私有,即隐藏属性,避免属性名与其它属性名冲突。
const myObject = (function() {
const privateVariable = Symbol('privateVariable');
return {
[privateVariable]: 'secret value'
};
})();
console.log(myObject[privateVariable]); // undefined
console.log(myObject[Symbol('privateVariable')]); // undefined
通过使用 Symbol 对象作为属性的 key,可以避免属性名与其它属性名冲突,同时也可以防止该属性被外部访问,从而达到隐藏属性的目的。
3. 全局注册表
Symbol 还提供了一种 全局注册表 的功能,可以将多个相同的 Symbol 对象符号都指向同一个对象实例,即全局共享。
const symbol1 = Symbol.for('eventName');
const symbol2 = Symbol.for('eventName');
console.log(symbol1 === symbol2); // true
在上述代码中,两个 Symbol 对象的描述字符串都是相同的,但实际上它们是全局共享的,也就是指向同一个对象实例。
3.1. Symbol.keyFor()
Symbol 还提供了一个方法 Symbol.keyFor(),可以从全局注册表中根据 Symbol 对象符号获取其描述字符串。
const symbol = Symbol.for('description');
console.log(Symbol.keyFor(symbol)); // 'description'
在上述代码中,通过使用 Symbol.keyFor() 方法获取了 symbol 对象的描述字符串 description。
总结
Symbol 类型的应用范围广泛,可以用来配置属性的描述信息、定义私有属性,还可以通过全局注册表中相同的 Symbol 对象来引用同一对象实例。
使用 Symbol 对象类型,可以提高代码的可靠性和安全性,因此开发者需要熟练掌握其使用方法。