const data = {
name: "Luke Skywalker",
__typename: "People",
[Symbol("id")]: "Value for the first Symbol(id)",
[Symbol("id")]: "Value for the second Symbol(id)",
};
const idSymbolKeys = Object.getOwnPropertySymbols(data).filter(
(s) => s.description === "id"
);
console.log("'id' symbols found:", idSymbolKeys.length);
console.log(data[idSymbolKeys[0]]);
console.log(data[idSymbolKeys[1]]);
4条答案
按热度按时间doinxwow1#
Symbols
被设计为定义唯一的属性名以避免冲突,因此您应该访问用于构造对象的符号,或者使用getOwnPropertySymbols
获取所有符号elcex8rz2#
那个对象初始化器是无效的,所以很难回答。
如果这真的是一个Symbol命名的属性,答案取决于Symbol是否全局注册。
如果不是,你只能通过
getOwnPropertySymbols
找到这个符号。如果是唯一的符号,很好,你的状态很好:这里假设只有一个Symbol命名的属性,我们可能不应该这样做,相反,让我们寻找描述为
"id"
的Symbol:我应该注意到,多个符号具有相同的描述是完全有效的,所以上面的代码再次使用了它找到的 * 第一个 * 符号,但尽管这很奇怪,但可能有多个符号:
但是如果它是全局注册的,并且你知道它注册在哪个字符串下,你可以使用
Symbol.for
来获取它:t8e9dugd3#
添加到@ T. J. Crowder,符号也可以通过
Reflect.ownKeys
发现,Reflect.ownKeys
将列出所有对象自己的键:属性名称和符号。djmepvbi4#
可以使用Object.getOwnPropertySymbols()来检索它,但这将检索绑定到对象的所有符号。如果要直接获取对象上的特定符号,则需要存储该Symbol对象以供重用。