代码之家  ›  专栏  ›  技术社区  ›  goodvibration

如何获取符号属性的值

  •  2
  • goodvibration  · 技术社区  · 6 年前

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

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

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

    如何获取该键的值?

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

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

    谢谢:)

    3 回复  |  直到 6 年前
        1
  •  1
  •   Marcos Casagrande    6 年前

    您将无法通过键直接访问它,除非您有实际的引用: Symbol('asyncId') 因为每个符号都是 独特的

    函数的作用是:返回一个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
     

    注: 对象可以有多个键,其中 key.toString() === 'Symbol(asyncId)' ,这不是常见的,但请注意,因此您可能希望使用除 .find 如果是这样的话。

    注二 : 您不应该更改该属性的值,因为它应该只用于内部访问,即使该属性不是只读的。

    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]));
        2
  •  0
  •   Nina Scholz    6 年前

    你需要储存 Symbol 并将其用作对象的访问器。

    从返回的每个符号值 Symbol() 是独一无二的。符号值可以用作对象属性的标识符;这是数据类型的唯一用途。有关用途和用法的进一步说明,请参见 glossary entry for Symbol .

    var asyncId = 42,
        symbol = Symbol(asyncId),
        object = { [symbol]: 2781 };
    
    console.log(object[symbol]);
    console.log(symbol.toString());
        3
  •  0
  •   aciurea    6 年前

    使用object.getownPropertySymbols(obj)并对其进行迭代