访问对象上 Symbol(id) 属性 的值

Access the value of Symbol(id) property on an object

我有一个从第 3 方 API 获取的对象,如下所示:

{
    name:"Luke Skywalker",
    __typename:"People",
    Symbol(id):"ROOT_QUERY.people."
}

虽然 "Luke Skywalker" 可以通过 object.name 访问, 如何获取此对象的 Symbol(id) 属性 的值?

Symbols 旨在定义唯一的 属性 名称以避免冲突。因此,您应该可以访问用于构造对象的符号,或者使用 getOwnPropertySymbols

获取所有符号

const obj = {
  [Symbol('id')]: 1
}

console.log(obj[Symbol('id')])

const symbols = Object.getOwnPropertySymbols(obj)

console.log(obj[symbols[0]])

您可以使用 Object.getOwnPropertySymbols() 来检索它,但这会检索与对象关联的所有符号。如果您想直接在对象上获取该特定符号,则需要将该符号对象存储在其他地方以供重复使用。

const sym = Symbol(id);
const example = {
  name:"Luke Skywalker",
  __typename:"People",
  [sym]:"ROOT_QUERY.people."
}

console.log(example[sym]) //Equals "ROOT_QUERY.people."

那个对象初始化器无效,所以很难回答。

如果那确实是一个以符号命名的 属性,答案取决于该符号是否已全局注册。

如果不是,您只能通过 getOwnPropertySymbols 找到符号。如果它是唯一的,很好,你的状态很好:

const data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};
console.log(data[Object.getOwnPropertySymbols(data)[0]]);

假设只有一个名为 属性 的符号,我们可能不应该这样做。相反,让我们寻找具有描述性字符串 "Symbol(id)":

的符号

const data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};
const sym = Object.getOwnPropertySymbols(data).find(function(s) {
    return String(s) === "Symbol(id)";
});
console.log(sym ? data[sym] : "Symbol(id) not found");


但是如果它是全局注册的并且你知道它注册在哪个字符串下,你可以使用 Symbol.for 来获取它:

const data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol.for("id")]:"ROOT_QUERY.people."
};
console.log(data[Symbol.for("id")]);

添加到@T.J。 Crowder,Symbols 也可以通过 Reflect.ownKeys 发现,它将列出所有对象自己的键:属性 names & symbols.

const data = {
    name:"Luke Skywalker",
    __typename:"People",
    [Symbol("id")]:"ROOT_QUERY.people."
};

const sym = Reflect.ownKeys(data).find(s => {
  return String(s) === "Symbol(id)";
});
console.log(sym ? data[sym] : "Symbol(id) not found");