在 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