如何获取Symbol属性的值

时间:2018-05-21 17:12:14

标签: javascript node.js dictionary

我在NodeJS中有一个对象(套接字是准确的)。

当我打印它时,我看到其中一个条目是:

[Symbol(asyncId)]: 2781 // the numeric value changes

如何获取此类密钥的值?

我已尝试socket['[Symbol(asyncId)]'],但获得undefined

表达式socket.[Symbol(asyncId)]显然不起作用。

谢谢:)

3 个答案:

答案 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)并迭代它