ECMAScript 2016 (ES7) 新特性之 Object.getOwnPropertyNames() 返回 Symbol

在 ECMAScript 2016 (ES7) 中,Object.getOwnPropertyNames() 方法可以返回对象中的 Symbol 属性名了。在此之前,该方法只会返回对象中的字符串属性名。

什么是 Symbol

Symbol 是 ECMAScript 6 新加入的基本数据类型,用来表示独一无二的值。它是一种不可变的原始数据类型,不能被改变并且在代码中始终保持唯一性。

比如,你可以使用 Symbol 来定义一个对象的唯一属性名:

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

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

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

Object.getOwnPropertyNames() 方法

Object.getOwnPropertyNames() 方法会返回一个由指定对象的所有自身属性名称(包括 Symbol 属性名)组成的数组。这个数组中的元素顺序与手动遍历该对象属性时的顺序一致。

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

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

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

在上面的代码中,我们可以看到 Object.getOwnPropertyNames() 方法只会返回对象中的字符串属性名,而不会返回 Symbol 属性名。

Object.getOwnPropertySymbols() 方法

为了获取对象中的 Symbol 属性名,我们可以使用 Object.getOwnPropertySymbols() 方法。这个方法返回一个由指定对象的所有自身 Symbol 属性名称组成的数组。

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

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

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

在上面的代码中,我们可以看到 Object.getOwnPropertySymbols() 方法只会返回对象中的 Symbol 属性名,而不会返回字符串属性名。

Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 结合使用

如果我们想要获取对象中所有的属性名称(包括字符串属性名和 Symbol 属性名),我们可以结合使用 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 方法。

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

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

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

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

在上面的代码中,我们使用 Spread Operator 将 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 方法返回的数组展开到一个新数组中,然后通过使用 Array.prototype.map() 方法将 Symbol 属性名转化为字符串。

结论

通过 ECMAScript 2016 (ES7) 中 Object.getOwnPropertyNames() 返回 Symbol 属性名的新特性,我们可以更方便地获取对象中所有属性(包括字符串属性名和 Symbol 属性名),对于开发高质量、可维护的 JavaScript 应用程序非常有用。

参考资料

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672efe36eedcc8a97c8bda35