Javascript 访问对象上符号(id)属性的值

Javascript 访问对象上符号(id)属性的值,javascript,ecmascript-6,ecmascript-5,Javascript,Ecmascript 6,Ecmascript 5,我从第三方API获取了一个对象,如下所示: { name:"Luke Skywalker", __typename:"People", Symbol(id):"ROOT_QUERY.people." } 虽然“卢克·天行者”可以通过object.name访问, 如何访问此对象的Symbol(id)属性值?Symbols用于定义唯一的属性名称以避免冲突。因此,您应该可以访问用于构造对象的符号,或者使用 const obj={ [符号('id')]:1 } console

我从第三方API获取了一个对象,如下所示:

{
    name:"Luke Skywalker",
    __typename:"People",
    Symbol(id):"ROOT_QUERY.people."
}
虽然“卢克·天行者”可以通过object.name访问,
如何访问此对象的Symbol(id)属性值?

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

const obj={
[符号('id')]:1
}
console.log(obj[Symbol('id')]))
常量符号=Object.getOwnPropertySymbols(obj)

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
查找符号。如果这是唯一的一个,很好,你的状态很好:

var数据={
姓名:“卢克·天行者”,
__字体名称:“人”,
[Symbol(“id”)]:“ROOT_QUERY.people。”
};

log(数据[Object.getOwnPropertySymbols(数据)[0]])添加到@T.J.Crowder中,符号也可以通过
Reflect.ownKeys
来发现,它将列出所有对象自己的键:属性名称和符号

const数据={
姓名:“卢克·天行者”,
__字体名称:“人”,
[Symbol(“id”)]:“ROOT_QUERY.people。”
};
const sym=Reflect.ownKeys(数据).find(s=>{
返回字符串==“符号(id)”;
});

console.log(sym?数据[sym]:“找不到符号(id”)
您的意思是
对象变量['Symbol(id)]
?我觉得很奇怪。或者可能是
objectVariable.Symbol(id)
?我试过了,但它不起作用可能Symbol在JavaScription中有特殊的含义现在很难回答这个问题。您显示的是无效的对象初始值设定项,因此我们必须猜测对象实际上是如何创建的。但是,根据id是什么,有几种方法可以创建它,并且它们显著地影响问题的答案。Yury的答案是一种方法,但请注意,如果该符号是全局注册的,另一种方法将涉及
Symbol.for
。所以我们只需要更多的信息。@T.J.Crowder这是从API获取的响应对象,我想我无法检查对象是如何初始化的,这些值只是从chrome控制台复制的。@BakhtiiarMuzakparov:好吧,同样,符号是如何创建的很重要。Chrome的控制台将以相同的方式显示符号,无论它是创建它的
Symbol(“id”)
还是
Symbol.for(“id”)
。有关详细信息,请参见我的答案。OP(在评论中)说他们从API获取此对象,因此他们不会有符号(除了从对象检索符号,或者如果它是全局注册的)。将您标记为答案。第一个选项已经起作用了,所以我相信当时symbol并没有在全球注册。谢谢@BakhtiiarMuzakparov:如果第二个不起作用,是的,这意味着它没有在字符串
“id”
下全局注册。请注意,如果他们在API升级时向该对象添加其他符号,则需要小心选择正确的符号。我在上面添加了(新的)第二个代码块,以帮助您确保获得正确的代码块。官方文档甚至没有显示这一点,这有点可笑:@AndroidDev-MDN不是“官方文档”,它是Mozilla的社区驱动文档站点。:-)唯一的官方文件是。MDN是由世界各地的程序员编写的。总的来说,这是非常非常好的,但是这里和那里有一个奇怪的差距——任何人都可以解决它。:-)但是,有什么地方遗漏了。。。?似乎至少涵盖了上述内容……是的,使用
符号。对于
来说,碰撞又回来了。