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

Javascript 如何获取符号名称(文字)?,javascript,symbols,Javascript,Symbols,以下情况: var myVehicle = { brand: 'Tesla' }; var isMoving = Symbol(); var currentStatus = Symbol(); myVehicle[isMoving] = true; myVehicle[currentStatus] = 'moving'; 我想打印我的对象中使用的“符号属性”的名称myVehicle console.log( myVehicle[isMoving], // true myV

以下情况:

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()]
这个问题没有真正意义。这些变量名实际上与它们引用的符号实例无关。构造符号时,可以为其指定一个字符串作为描述:

var isMoving = Symbol("isMoving");
当您
console.log()
这样一个符号时,您将看到

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

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

出现问题的原因是Javascript符号没有“名称”

符号实际上没有名字 将符号指定给变量时,会给符号一个紧跟其后的名称。 例如,考虑这个代码:

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

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

符号确实有描述 如果在创建符号时传入描述,它会保留该字符串以供参考。 你可以考虑这个符号的“名字”,尽管那些“名字”并不一定是唯一的。 稍后,您可以在符号的
.toString()
方法的返回值中看到描述

console.log(Symbol('mySymbol').toString()) // prints "Symbol(mySymbol)"
如果您只想获得原始描述,可以去掉额外的内容:

console.log(Symbol('mySymbol').toString().slice(7,-1))
更新符号现在有了一个属性,您可以使用它来代替调用
toString
并去掉多余的字符

console.log(Symbol('mySymbol').description)
结论
  • 变量有一个名称
  • 变量将指向一个值
  • 符号是一种价值
  • 但值不会指向包含它的任何变量
  • 因此,无法从值中获取变量名
  • 但如果您想在调试时看到一些有用的东西,请给出符号描述

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

以下是如何创建带有说明的符号:

var isMoving = Symbol("isMoving");
const isMoving=Symbol('isMoving');
以下是访问此描述的方式:

var isMoving = Symbol("isMoving");
console.log(isMoving.description);//打印“isMoving”
属性
说明
还不是官方EcmaScript标准的一部分。在撰写本文时,它处于第3阶段。因此,并非所有环境都支持它。有关详细信息,请参阅

请注意,符号的描述与包含它的变量的名称无关。考虑以下事项:

const symbol1=Symbol('Hello world!');
console.log(symbol1.description);//打印“Hello world!”,*而不是*“symbol1”
常数symbol2=symbol1;
console.log(symbol2.description);//还打印“你好,世界!”

console.log()显示的内容可能与浏览器有关,但描述的概念是,它在调试时是可见的,因此控制台当然应该显示它。谢谢@Pointy,您也能告诉我如何获取名称吗?(我不想得到“Symbol(isMoving)”,目前没有问题的是,我想得到Symbol属性名称als数组(类似于Object.getOwnPropertyNames等)@对于符号名称和符号列表,我感到很孤独。@Bergi你能给我举个例子吗?谢谢,不幸的是,没有本机解决方案,map+toString不是一个优雅的解决方案,…为什么不将名称作为值,而不是对内部值的符号重新引用,这是不可读的。Hi@Nina,在真正的用例中,它不是这样的对于对象,它是一个div框,当前正在移动,我使用了一个简短的(可能没有意义的)示例,…我所要知道的是:如何获得名称,。。