ES6/ES2015 引入了一种新的基本数据类型 Symbol
。Symbol
是表示唯一标识符的数据类型,用于标识对象的属性名,避免命名冲突,也可以用作私有属性。
创建 Symbol
创建一个 Symbol
可以使用 Symbol()
方法。
示例代码:
const mySymbol = Symbol();
可以通过传递可选的字符串来标记 Symbol
。这个字符串仅用于调试或调用 .toString()
方法。
示例代码:
const mySymbol = Symbol('my symbol'); console.log(mySymbol); // Symbol(my symbol) console.log(mySymbol.toString()); // "Symbol(my symbol)"
使用 Symbol 作为对象属性
通过将 Symbol
作为对象的属性名,可以避免属性名的冲突。当使用 Object.keys()
方法列出对象的属性时,Symbol
属性不会被列出,也不会被 for-in
循环遍历。
示例代码:
const mySymbol = Symbol(); const obj = {}; obj[mySymbol] = 'foo'; console.log(obj[mySymbol]); // "foo" console.log(Object.keys(obj)); // [] console.log(Object.getOwnPropertyNames(obj)); // []
使用全局 Symbol 注册表
通过 Symbol.for()
方法,可以在全局 Symbol
注册表中注册 Symbol
,然后可以在整个应用程序中重用这些 Symbol
。
示例代码:
// javascriptcn.com 代码示例 const mySymbol = Symbol.for('my symbol'); const obj1 = { [mySymbol]: 'foo' }; const obj2 = { [mySymbol]: 'bar' }; console.log(obj1[mySymbol]); // "foo" console.log(obj2[mySymbol]); // "bar"
内置 Symbol
ES6/ES2015 中有许多内置的 Symbol
,以及一些在类和对象中使用的特殊 Symbol
。以下是一些常见的内置 Symbol
:
Symbol.iterator
:一个方法,返回对象的默认迭代器,用于支持for-of
循环语句。Symbol.species
:一个方法,返回创建实例对象的函数,用于继承自内置对象的子类。Symbol.match
、Symbol.replace
、Symbol.search
、Symbol.split
:用于正则表达式方法。
示例代码:
const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); console.log(iterator.next()); // {value: 1, done: false} console.log(iterator.next()); // {value: 2, done: false} console.log(iterator.next()); // {value: 3, done: false} console.log(iterator.next()); // {value: undefined, done: true}
总结
通过在对象中使用 Symbol
属性名,可以避免属性名冲突,并且可用于实现私有属性。Symbol.for()
方法可以用于创建全局 Symbol
,以便整个应用程序中都重用这些 Symbol
。
建议在使用 Symbol
时,应将其作为常量声明,并使用描述性名称进行命名,以提高代码的可读性和维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654a46b87d4982a6eb46b67f