我在NodeJS中有一个对象(套接字是准确的)。
当我打印它时,我看到其中一个条目是:
[Symbol(asyncId)]: 2781 // the numeric value changes
如何获取此类密钥的值?
我已尝试socket['[Symbol(asyncId)]']
,但获得undefined
。
表达式socket.[Symbol(asyncId)]
显然不起作用。
谢谢:)
答案 0 :(得分:1)
您无法直接通过密钥访问它,除非您引用实际的Symbol('asyncId')
,因为每个符号唯一
Symbol()函数返回一个类型为symbol的值,具有static 暴露内置对象的几个成员的属性具有静态 暴露全局符号注册表的方法,类似于 内置对象类,但由于它是不完整的构造函数 不支持语法“new Symbol()”。
你可以做的是使用Reflect.ownKeys遍历对象自己的属性键,其中包括普通属性&符号,然后获得该参考。
您还可以使用:Object.getOwnPropertySymbols()
function getObject() {
// You don't have access to this symbol, outside of this scope.
const symbol = Symbol('asyncId');
return {
foo: 'bar',
[symbol]: 42
};
}
const obj = getObject();
console.log(obj);
console.log(obj[Symbol('asyncId')]); // undefined
// or Object.getOwnPropertySymbols(obj)
const symbolKey = Reflect.ownKeys(obj)
.find(key => key.toString() === 'Symbol(asyncId)')
console.log(obj[symbolKey]); // 42
注意:对象可以有多个键key.toString() === 'Symbol(asyncId)'
,这不常见,但要注意,所以你可能想要使用{{1}以外的其他功能如果是这样的话。
注意II : 您不应该更改该属性的值,因为它应该仅用于内部访问,即使该属性不是只读属性。
.find
答案 1 :(得分:0)
您需要提前存储Symbol
并将其用作对象的访问者。
中找到
Symbol()
返回的每个符号值都是唯一的。符号值可以用作对象属性的标识符;这是数据类型的唯一目的。有关目的和用法的进一步说明可以在glossary entry for Symbol。
var asyncId = 42,
symbol = Symbol(asyncId),
object = { [symbol]: 2781 };
console.log(object[symbol]);
console.log(symbol.toString());
答案 2 :(得分:0)
使用Object.getOwnPropertySymbols(obj)并迭代它