在 ES6 中引入了一个新的基本数据类型 Symbol
,用于表示独一无二的值。 Symbol
可以用来创建全局唯一的标识符,这些标识符可以用作对象属性的键值。在 ES6 之后,ES7、ES8、ES9 和 ES10 都对 Symbol 进行了扩展,让它变得更有用。
基础使用
Symbol
的用法非常简单。我们可以通过使用 Symbol()
来创建一个新的符号,例如:
const mySymbol = Symbol(); console.log(mySymbol); // Symbol()
这将返回一个全局唯一的符号。您也可以使用可选的描述参数来描述符号,例如:
const mySymbol = Symbol('This is my symbol'); console.log(mySymbol); // Symbol(This is my symbol)
由于 Symbol
是基础数据类型,因此不能使用 new
操作符进行实例化。
创建全局符号
通过在全局符号注册表中注册符号,您可以创建全局符号。这样的符号可以在多个文件或项目中使用,并且仍然是全局唯一的。 要在全局符号注册表中注册符号,请使用 Symbol.for()
方法:
const myGlobalSymbol = Symbol.for('MyGlobalSymbol'); console.log(myGlobalSymbol); // Symbol(MyGlobalSymbol)
这将返回一个全局符号,名为 "MyGlobalSymbol"。在以后的代码中,您可以通过用相同的名称调用 Symbol.for('MyGlobalSymbol')
来获取该符号。
额外的 Symbol 属性
Symbol 还有许多其他属性,这些属性可以让它更加有用。以下是一些例子:
Symbol.iterator
Symbol.iterator
用于定义对象的默认迭代器,例如:
-- -------------------- ---- ------- ----- -------- - - ------------------ ----------- - ----- -- ----- -- ----- -- - -- --- ------ ----- -- --------- - ------------------- - -- ------- -- - -- - -- -
在这个例子中,我们可以看到 Symbol.iterator
用于定义一个迭代器,该迭代器在对象被迭代时被调用。在这个迭代器函数中,我们使用 yield
关键字来创建连续的值,然后将其与对象关联起来。我们可以通过 for..of
循环来迭代对象。
Symbol.species
Symbol.species
用于定义方法返回的对象类型,例如:
-- -------------------- ---- ------- ----- ------- - ------ --- ------------------ - ------ ------ - ------------- - ------ --- ------------------------------------- -- --- - - ----- -------------- ------- ------- - ------ --- ------------------ - ------ --------------- - - ----- ------- - --- ---------- ----- -------------- - --- ----------------- ----- ------ - ---------------------- ----- ------ - ----------------------------- ------------------ ---------- --------- -- ---- ------------------ ---------- ---------------- -- ----
在这个例子中,我们定义了一个基本类 MyClass
和一个派生类 MyDerivedClass
。在 MyClass
中,我们使用 get
方法来定义 Symbol.species
,使其返回 Array
。在 MyDerivedClass
中,我们重新定义了 Symbol.species
,使其返回 MyDerivedClass
。通过这种方式,我们可以定义函数 createArray()
,该函数将我们派生类的初始类型视为数组,并对其进行操作。
Symbol.match
Symbol.match
用于指定一个函数,该函数将在字符串被调用时用于匹配,例如:
class MyMatcher { [Symbol.match](string) { return string.indexOf('hello') >= 0; } } console.log('hello world'.match(new MyMatcher())); // true console.log('goodbye world'.match(new MyMatcher())); // false
在这个例子中,我们定义了一个类 MyMatcher
,该类包含的 Symbol.match
方法在字符串中查找 'hello'
。我们然后在两个字符串上调用 match()
函数,并使用给定的 MyMatcher
进行匹配。
结论
Symbol
是一个强大而有用的功能,可以让我们创建全局唯一的标识符,并在对象属性中存储它们。如果您在编写新的 ES6 代码,则应考虑使用 Symbol
来创建标识符,而不是使用字符串等其他类型,以确保属性键唯一性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6771ef746d66e0f9aad30244