什么是 Symbol?
Symbol 是 ECMAScript 2015 引入的一种新的原始数据类型,表示一个独一无二的标识符。每个 Symbol 都是唯一的,即使它们具有相同的描述符也是如此。Symbol 的主要用途是作为对象属性的键,这样就可以避免键名冲突的问题。
Symbol 的创建方法如下:
const symbol = Symbol();
Symbol 可以接受一个可选的字符串参数,作为 Symbol 的描述符:
const symbol = Symbol('description');
Symbol 属性
在 ECMAScript 2019 中,Symbol 新增了一些属性,使其更加强大和灵活。
Symbol.for()
Symbol.for() 方法会先在全局 Symbol 注册表中查找指定描述符的 Symbol,如果找到则直接返回该 Symbol,否则会创建一个新的 Symbol 并注册到全局 Symbol 注册表中。
const symbol1 = Symbol.for('foo'); const symbol2 = Symbol.for('foo'); console.log(symbol1 === symbol2); // true
Symbol.keyFor()
Symbol.keyFor() 方法返回给定 Symbol 在全局 Symbol 注册表中的键名,如果该 Symbol 不在注册表中则返回 undefined。
const symbol = Symbol.for('foo'); const key = Symbol.keyFor(symbol); console.log(key); // 'foo'
Symbol.asyncIterator
Symbol.asyncIterator 属性是一个用于生成异步迭代器的 Symbol。
// javascriptcn.com 代码示例 const obj = { async *[Symbol.asyncIterator]() { yield 1; yield 2; yield 3; } }; (async () => { for await (const x of obj) { console.log(x); } })();
Symbol.matchAll()
Symbol.matchAll() 方法用于在字符串中查找所有匹配某个正则表达式的子串,并返回一个迭代器。
const str = 'hello world'; const regExp = /[a-z]/g; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match); }
总结
Symbol 的引入使得 ECMAScript 中的对象属性键可以更加灵活和独特,避免了键名冲突的问题。Symbol 的新增属性使其更加强大和方便,可以方便地生成异步迭代器和查找所有匹配正则表达式的子串。在实际开发中,我们可以结合 Symbol 的特性,更好地设计和实现对象模型。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6576c8d2d2f5e1655d037e60