在 ES6 中,新增了一种基本数据类型 Symbol。Symbol 作为一种全新的数据类型,与其他类型不同,它的值是唯一的,可以用作对象属性的键名。
Symbol 的创建
Symbol 可以通过 Symbol()
函数来创建,创建时可以传入一个可选的字符串作为 Symbol 的描述。例如:
// 创建一个没有描述的 Symbol const symbol1 = Symbol(); // 创建一个描述为 'foo' 的 Symbol const symbol2 = Symbol('foo');
Symbol 的应用
1. 对象属性键名
Symbol 可以作为对象属性的键名,且不会与其他属性的键名冲突。例如:
const obj = { [Symbol('foo')]: 'value1', [Symbol('foo')]: 'value2' }; console.log(obj); // {Symbol(foo): "value1", Symbol(foo): "value2"}
2. 避免属性名冲突
由于 Symbol 的值是唯一的,可以用于避免属性名冲突的问题。例如:
const obj = { [Symbol('foo')]: 'value1', [Symbol('bar')]: 'value2' }; console.log(obj[Symbol('foo')]); // undefined console.log(obj[Symbol('bar')]); // undefined
3. 定义类的私有属性
由于 Symbol 的值是唯一的,可以用于定义类的私有属性。例如:
-- -------------------- ---- ------- ----- ----- - --------------- ----- ------ - ----------------- - ----------- - ----- - --------- - ------ ------------ - - ----- ------ - --- -------------- ------------------------------ -- --- -------------------------- -- ---------
4. Symbol 值的属性描述
Object.getOwnPropertySymbols 方法可以获取对象的所有 Symbol 属性键名。例如:
const obj = { [Symbol('foo')]: 'value1', [Symbol('bar')]: 'value2', name: 'Tom' }; console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(foo), Symbol(bar)]
5. Symbol.for 和 Symbol.keyFor
Symbol.for 方法可以根据传入的字符串参数创建或获取一个全局 Symbol。例如:
const symbol1 = Symbol.for('foo'); const symbol2 = Symbol.for('foo'); console.log(symbol1 === symbol2); // true
Symbol.keyFor 方法可以获取一个全局 Symbol 的键名。例如:
const symbol1 = Symbol.for('foo'); console.log(Symbol.keyFor(symbol1)); // foo
总结
Symbol 是一种全新的数据类型,它的值是唯一的,可以用作对象属性的键名。Symbol 的应用包括:对象属性键名、避免属性名冲突、定义类的私有属性、Symbol 值的属性描述等。掌握 Symbol 的用法可以提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65c97bf2add4f0e0ff346f72