如何获取符号名称(文字)?

时间:2018-01-10 14:20:58

标签: javascript symbols

以下情况:

var myVehicle = { brand: 'Tesla' };

var isMoving = Symbol();
var currentStatus = Symbol();

myVehicle[isMoving] = true;
myVehicle[currentStatus] = 'moving';

我想在对象myVehicle

中打印使用过的“符号属性”的名称
console.log(
    myVehicle[isMoving],  // true
    myVehicle[currentStatus],  // 'moving',
    Reflect.ownKeys(myVehicle),  // [ 'brand', Symbol(), Symbol() ]
    Object.getOwnPropertySymbols(myVehicle), // [ Symbol(), Symbol() ]
);

我如何获得如下名称:

[isMoving, currentStatus]代替[ Symbol(), Symbol() ]

3 个答案:

答案 0 :(得分:4)

这个问题确实没有意义。那些变量名称与它们引用的Symbol实例没有任何关系。构造符号时,可以为其指定一个字符串作为描述:

var isMoving = Symbol("isMoving");

当你console.log()这样的符号时,你会看到

Symbol(isMoving)

您可以使用.toString()来获取说明,因此如果您想要所有符号属性中的描述字符串:

var descrs = Object.getOwnPropertySymbols(obj).map(s => s.toString());

答案 1 :(得分:3)

您遇到问题的原因是Javascript符号确实没有“名称”。

符号实际上没有名称

当您为变量指定符号时,会为该符号指定一个跟随它的名称。 例如,请考虑以下代码:

function getMeASymbol() {
  var alpha = Symbol()
  var beta = alpha
  return beta
}

var gamma = getMeASymbol()

在函数内部,我们创建一个符号并将其存储在alpha中。 然后我们在beta中存储相同的符号。 最后,我们返回符号,调用者将其存储在gamma中。 这三个变量名称中没有一个真正附加到符号上。 更重要的是,alphabeta在分配gamma时甚至不存在。

符号有描述

如果在创建符号时传入描述,则会保留该字符串以供参考。 您可能会认为符号的“名称”,尽管这些“名称”不一定是唯一的。 稍后,您可以在符号的.toString()方法的返回值内看到描述。

console.log(Symbol('mySymbol').toString()) // prints "Symbol(mySymbol)"

如果您想获得原始描述,可以去掉额外的东西:

console.log(Symbol('mySymbol').toString().slice(7,-1))

结论

  • 变量有名称。
  • 变量将指向一个值。
  • 符号是一种价值。
  • 但是值不会指向包含它的任何变量。
  • 因此您无法从值中获取变量名称。
  • 但是,如果您想在调试时查看有用的内容,请提供符号说明。

答案 2 :(得分:0)

正如@Pointy和@Neall所提到的,符号没有名称,但是可以有描述。

以下是创建带有说明的符号的方法:

const isMoving = Symbol('isMoving');

这是您访问此描述的方式:

console.log(isMoving.description); // Prints "isMoving"

属性description 尚未成为官方EcmaScript标准的一部分。在撰写本文时,它处于阶段3。因此,并非每个环境都支持它。有关详细信息,请参见the MDN article

请注意,符号的描述与保存符号的变量的名称无关。请考虑以下内容:

const symbol1 = Symbol('Hello world!');
console.log(symbol1.description); // Prints "Hello world!", *not* "symbol1"

const symbol2 = symbol1;
console.log(symbol2.description); // Also prints "Hello world!"