ES6 中引入了一种新的基本数据类型 —— Symbol。Symbol 是一种类似于字符串的数据类型,但可以保证唯一性,它通常被用作对象属性的键。相较于字符串键,Symbol 键具有更高的安全性、可扩展性和语义清晰性。
创建 Symbol
创建 Symbol 的主要方式是使用全局的 Symbol()
函数,它将生成一个唯一的、不可变的 Symbol 值。其中,Symbol 函数可以接收一个可选的字符串参数,用于描述 Symbol 的含义,但并不影响 Symbol 的唯一性。
const idSymbol = Symbol(); // 创建一个唯一的 Symbol const nameSymbol = Symbol('name'); // 创建具有描述信息的 Symbol
使用 Symbol
作为对象属性名
Symbol 可以作为对象属性名,使用方式与字符串键类似:
const nameSymbol = Symbol('name'); const person = {}; person[nameSymbol] = 'Alice'; console.log(person[nameSymbol]); // 'Alice'
避免属性名冲突
在 JavaScript 中,同名属性会发生覆盖,导致之前的属性内容丢失。而使用 Symbol 作为属性名可以避免这种情况的发生。
const ageSymbol = Symbol('age'); const person1 = { name: 'Bob', [ageSymbol]: 20 }; const person2 = { name: 'Alice', [ageSymbol]: 30 }; console.log(person1[ageSymbol]); // 20 console.log(person2[ageSymbol]); // 30
遍历 Symbol 属性
使用 Object.keys()
方法或 for...in
循环无法遍历 Symbol 属性。相应的,新增了两种方法:Object.getOwnPropertySymbols()
和 Reflect.ownKeys()
。
const idSymbol = Symbol('id'); const person = { name: 'Bob', [idSymbol]: 1 }; console.log(Object.getOwnPropertySymbols(person)); // [Symbol(id)] console.log(Reflect.ownKeys(person)); // ['name', Symbol(id)]
Symbol 的应用场景
1. 静态变量
在 JavaScript 中,没有明确的静态变量概念。但使用 Symbol 可以模拟出静态变量的效果,同时避免全局变量污染。
-- -------------------- ---- ------- ----- --------------- - -------------------- ----- ------- - ------------- - ---------- - -- - ------------------- - ------------- - ---------- - ------ ----------- - - ----- - - --- ---------- --------------------- -------------------------- -- -
2. 私有属性
JavaScript 中没有私有属性的概念,在对象中定义的属性都是公开的。但使用 Symbol 可以实现私有属性的效果,即外部无法访问或修改该属性。
-- -------------------- ---- ------- ----- ---------- - --------------- ----- ------ - ----------------- - ---------------- - ----- - --------- - ------ ----------------- - - ----- - - --- -------------- ------------------------- -- ----- --------------------------- -- ---------
3. 枚举属性
通常情况下,对象属性都是可枚举的,即可以通过 for...in
循环或 Object.keys()
方法遍历。但使用 Symbol 定义的属性默认是不可枚举的,可以用于隐藏对象属性。
const idSymbol = Symbol('id'); const person = { name: 'Bob', [idSymbol]: 1 }; for (const key in person) { console.log(key); // 'name' } console.log(Object.keys(person)); // ['name']
总结
Symbol 是一种新的基本数据类型,它具有唯一性、安全性、可扩展性和语义清晰性等优势。在对象中使用 Symbol 做为属性名,可以避免属性名冲突和通过枚举方法避免属性被遍历。Symbol 还可以模拟静态变量和实现私有属性等功能,是非常有用的一种数据类型。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648bc97f48841e9894a143e6