ECMAScript 2021 (ES12) 中 Symbol 的使用方法

阅读时长 5 分钟读完

在 ECMAScript 2015(ES6)中,Symbol 是一种新的原始数据类型,它可以用来创建唯一的标识符,从而避免名称冲突。在 ECMAScript 2021(ES12)中,Symbol 有了更多的用途和扩展,本文将介绍 Symbol 的使用方法和示例代码。

创建 Symbol

创建 Symbol 可以使用全局的 Symbol 函数,它可以接受一个可选的参数,用于描述 Symbol,这个描述只是一个字符串,用于调试和诊断。

上面的代码创建了两个不同的 Symbol,第二个 Symbol 有一个描述。

Symbol 作为对象属性名

Symbol 可以作为对象的属性名,这样可以避免属性名冲突。使用 Symbol 作为属性名时,需要使用方括号语法。

上面的代码创建了一个对象,并使用 Symbol 作为属性名,然后设置了属性值。使用方括号语法获取属性值时,也需要使用 Symbol。

内置 Symbol

ES6 中有一些内置的 Symbol,比如 Symbol.iterator,用于指定对象的默认迭代器。ES12 中新增了一些内置的 Symbol。

Symbol.matchAll

Symbol.matchAll 用于指定一个正则表达式的全局匹配器,它返回一个迭代器,可以迭代出所有匹配结果。

上面的代码使用 Symbol.matchAll 获取字符串中所有的 l。

Symbol.asyncIterator

Symbol.asyncIterator 用于指定对象的异步迭代器,它返回一个异步迭代器,可以迭代出所有的异步结果。

-- -------------------- ---- -------
----- ------------- - -
  ----- ------------------------- -
    ----- --
    ----- --
    ----- --
  -
--

------ ---------- -
  --- ----- ------ --- -- -------------- -
    -----------------
  -
-----

上面的代码创建了一个异步可迭代对象,并使用 Symbol.asyncIterator 指定了异步迭代器。然后使用 for await...of 循环异步迭代对象。

Symbol.hasInstance

Symbol.hasInstance 用于指定一个函数的 instanceof 运算符行为。它接受一个参数,表示被检查的对象。

上面的代码创建了一个类,并使用 Symbol.hasInstance 指定了 instanceof 运算符行为。

Symbol 属性描述符

ES6 中有一些属性描述符,比如 writable、enumerable、configurable 等。ES12 中新增了一些属性描述符,用于 Symbol 属性。

Symbol.toStringTag

Symbol.toStringTag 用于指定一个对象的 toString 方法返回的字符串。

上面的代码创建了一个类,并使用 Symbol.toStringTag 指定了 toString 方法返回的字符串。

Symbol.unscopables

Symbol.unscopables 用于指定一个对象的 with 语句中被排除的属性。

-- -------------------- ---- -------
----- --- - -
  -- --
  -- --
  --------------------- -
    -- ----
  -
--

---- ----- -
  --------------- -- -
  --------------- -- --------------- - -- --- -------
-

上面的代码创建了一个对象,并使用 Symbol.unscopables 指定了 with 语句中被排除的属性。

总结

Symbol 是一种新的原始数据类型,它可以用来创建唯一的标识符,避免名称冲突。ES12 中 Symbol 有了更多的用途和扩展,比如作为对象属性名、内置 Symbol、Symbol 属性描述符等。使用 Symbol 可以让代码更加简洁和可读。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65d5cf91add4f0e0ffd76318

纠错
反馈