如何获取 Symbol 属性的值

goo*_*ion 3 javascript dictionary node.js

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

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

[Symbol(asyncId)]: 2781 // the numeric value changes
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得这样的键的值?

我试过了,socket['[Symbol(asyncId)]']但得到了undefined

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

Mar*_*nde 5

您将无法直接通过 key 访问它,除非您引用了实际的: Symbol('asyncId'),因为每个 Symbol 都是唯一的

Symbol() 函数返回一个符号类型的值,具有公开多个内置对象成员的静态属性,具有公开全局符号注册表的静态方法,并且类似于内置对象类但作为构造函数是不完整的,因为它不支持语法“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
 
Run Code Online (Sandbox Code Playgroud)

注意:对象可以有多个键 where key.toString() === 'Symbol(asyncId)',这并不常见,但请注意,因此您可能希望使用其他功能,.find除非是这种情况。

注意 II:您不应更改该属性的值,因为它应该仅供内部访问,即使该属性不是只读的。

function getObject() {
       // You don't have access to this symbol, outside of this scope.
      const symbol = Symbol('asyncId');
      const symbol2 = Symbol('asyncId');

      return {
        foo: 'bar',
        [symbol]: 'the value I don\'t want',
        [symbol2]: 'the value I want'
      };

}
const obj = getObject();

const symbolKey = Reflect.ownKeys(obj)
  .find(key => key.toString() === 'Symbol(asyncId)')
  
console.log(obj[symbolKey]); // the value I don't want

console.log('=== All values ===');
Reflect.ownKeys(obj)
  .forEach(key => console.log(obj[key]));
Run Code Online (Sandbox Code Playgroud)