ECMAScript 2020: 解决 Symbol 类型的注意事项

阅读时长 4 分钟读完

在 ECMAScript 6 中,引入了 Symbol 类型,它是一种新的原始数据类型,用于创建唯一的标识符。Symbol 可以用作对象属性的键,这样可以避免属性名冲突的问题。在 ECMAScript 2020 中,Symbol 类型得到了进一步的改进和增强,但在使用时仍需注意以下事项。

1. Symbol 值的唯一性

Symbol 值是唯一的,每个 Symbol 值都有自己的标识符。因此,使用 Symbol 作为对象属性的键时,可以避免属性名冲突的问题。但需要注意的是,即使 Symbol 的描述相同,它们也是不相等的。

上述代码中,s1 和 s2 都是通过 Symbol('foo') 创建的,但它们并不相等,因为它们都是唯一的。

2. Symbol 的可迭代性

在 ECMAScript 2020 中,Symbol 类型新增了一个内置的 Symbol.iterator 属性,用于指定对象的默认迭代器。如果一个对象具有 Symbol.iterator 属性,则可以使用 for...of 循环遍历它。

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

--- ------ ---- -- ---- -
  ------------------
-
-- -
-- -
-- -
展开代码

上述代码中,obj 对象具有 Symbol.iterator 属性,该属性的值为一个生成器函数,用于生成对象的迭代器。通过 for...of 循环遍历 obj 对象时,会依次输出生成器函数生成的值。

3. Symbol 的包装对象

在 JavaScript 中,原始数据类型和对象类型是有区别的。原始数据类型(包括 Undefined、Null、Boolean、Number 和 String)是不可变的,而对象类型是可变的。在 ECMAScript 6 中,Symbol 类型也是一种原始数据类型,因此它是不可变的。但是,如果将 Symbol 类型封装在一个对象中,则可以改变它的值。

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

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

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

--------------------- -- ---
展开代码

上述代码中,s1 是一个 Symbol 类型的变量,它的值为 Symbol('foo')。将 s1 作为对象的属性名时,可以获取到对应的属性值。然而,将 s1 封装在一个对象中后,就可以通过 Object() 函数将其转换成一个包装对象。此时,s2 的值为 Symbol('foo'),但它是一个对象类型的值,因此可以作为对象的属性名使用,并且可以获取到对应的属性值。

4. Symbol 的内置属性

在 ECMAScript 2020 中,Symbol 类型新增了一些内置的 Symbol 属性,用于指定对象的行为。以下是一些常用的内置 Symbol 属性:

  • Symbol.toStringTag:用于指定对象的默认 toString() 表示形式。
  • Symbol.hasInstance:用于指定对象的 instanceof 行为。
  • Symbol.species:用于指定对象的默认构造函数。
-- -------------------- ---- -------
----- ------- ------- ----- -
  ------ --- ------------------ -
    ------ ------
  -
-

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

------------------ ---------- --------- -- -----
------------------ ---------- ------- -- ----
展开代码

上述代码中,MyArray 类继承自 Array 类,并且重写了 slice() 方法。在 MyArray 类中,通过 static get Symbol.species 指定了默认的构造函数为 Array。因此,在对 arr 数组进行 slice() 操作时,返回的结果是一个 Array 类型的对象,而不是 MyArray 类型的对象。

结语

Symbol 类型是 ECMAScript 6 中新增的一个原始数据类型,用于创建唯一的标识符。在 ECMAScript 2020 中,Symbol 类型得到了进一步的改进和增强,但在使用时需要注意其唯一性、可迭代性、包装对象和内置属性等问题。掌握这些注意事项,可以更好地使用 Symbol 类型,提高代码的质量和可维护性。

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

纠错
反馈

纠错反馈