在 ECMAScript2015 中,symbols 出现了。该类型是用于创建私有类成员的新型基本数据类型。它们是一种不可变的类型,可以被用作对象属性的键。尽管许多人已经熟悉了 symbols,但 Object.getOwnPropertySymbols() 可能仍然是一个陌生的对象方法。本文将介绍 Object.getOwnPropertySymbols() 并探讨与 symbols 相关的其他主题。
Symbols 的概念
在 JavaScript 中,symbols 是一种新的基本数据类型,用于表示关键字,就像字符串和数字一样。每个 symbol 都是唯一且不可变的,它们可以用于对象属性的键。symbols 的声明方式如下:
const symbol1 = Symbol(); const symbol2 = Symbol('foo'); const symbol3 = Symbol('foo'); console.log(symbol1 === symbol2); // false console.log(symbol2 === symbol3); // false
symbols 可以用于定义非公共属性,例如下面的代码片段:
-- -------------------- ---- ------- ----- ------ - ----------- - ----- ---------- - --------------- ------ ----- - ----------------- - ---------------- - ----- - --------- - ------ ----------------- - -- ----- ----- - - --- --------------- ------------------------- -- ---- -------------------- -- ---------
在此示例中,symbols 用于定义一个在类中使用的属性。由于该属性是 symbols 类型,因此它在类的外部是不可访问的。
Object.getOwnPropertySymbols
Object.getOwnPropertySymbols() 是一个对象方法,用于返回一个数组,该数组包含对象身上的所有符号属性。请看下面的代码:
const obj = { id: 1, [Symbol('foo')]: 'fooval', [Symbol('bar')]: 'barval' }; console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(foo), Symbol(bar)]
在此示例中,我们使用 [] 符号分配两个 symbols,然后使用 Object.getOwnPropertySymbols() 方法将它们作为数组返回。这是有益的应用程序,例如当您需要检查对象中的所有非公共属性时。在某些情况下,您可能只需要获得 symbols 的总数。如下所示:
const obj = { id: 1, [Symbol('foo')]: 'fooval', [Symbol('bar')]: 'barval' }; console.log(Object.getOwnPropertySymbols(obj).length); // 2
在此示例中,我们使用完全相同的对象和 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