ECMAScript 2017 中的 Object.getOwnPropertySymbols:什么是 symbols?

阅读时长 6 分钟读完

在 ECMAScript2015 中,symbols 出现了。该类型是用于创建私有类成员的新型基本数据类型。它们是一种不可变的类型,可以被用作对象属性的键。尽管许多人已经熟悉了 symbols,但 Object.getOwnPropertySymbols() 可能仍然是一个陌生的对象方法。本文将介绍 Object.getOwnPropertySymbols() 并探讨与 symbols 相关的其他主题。

Symbols 的概念

在 JavaScript 中,symbols 是一种新的基本数据类型,用于表示关键字,就像字符串和数字一样。每个 symbol 都是唯一且不可变的,它们可以用于对象属性的键。symbols 的声明方式如下:

symbols 可以用于定义非公共属性,例如下面的代码片段:

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

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

在此示例中,symbols 用于定义一个在类中使用的属性。由于该属性是 symbols 类型,因此它在类的外部是不可访问的。

Object.getOwnPropertySymbols

Object.getOwnPropertySymbols() 是一个对象方法,用于返回一个数组,该数组包含对象身上的所有符号属性。请看下面的代码:

在此示例中,我们使用 [] 符号分配两个 symbols,然后使用 Object.getOwnPropertySymbols() 方法将它们作为数组返回。这是有益的应用程序,例如当您需要检查对象中的所有非公共属性时。在某些情况下,您可能只需要获得 symbols 的总数。如下所示:

在此示例中,我们使用完全相同的对象和 symbols,但是我们只是获取符号的数量。

Symbols 与枚举

symbols 是不可枚举的。当一个对象的属性被定义为 symbol 时,它就不会出现在 for...in 循环、Object.keys()、JSON.stringify() 和其他枚举类型的属性列出 API 中。虽然这减少了开发人员的运行时间错误,但这也是一个问题,因为 symbols 容易被遗忘。

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

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

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

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

在此示例中,我们使用 for...in 循环、Object.keys() 和 JSON.stringify() 方法来访问对象中的所有属性,但是我们只能获取 id 属性,而没有 Symbol('foo') 的属性。使用 Object.getOwnPropertySymbols() 可以访问所有 symbols,但是使用该方法时必须了解符号的存在。

总结

Object.getOwnPropertySymbols 是一个方便的方法,可用于获取对象上的所有 symbols,并且不会列出可枚举的属性。symbols 可以用于定义非公共属性,这些属性可以表示私有类成员。当使用 symbols 时一定要小心,因为它们被认为是不可变的。在编写符号属性的代码时,请确保对其存在有适当的了解。当使用 symbols 时,请记住,它们不是魔法。它们只是另一种数据类型。

示例代码

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

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

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

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

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

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

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

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

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

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

纠错
反馈