访问对象上 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");
我有一个从第 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");