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

Posted

技术标签:

【中文标题】如何获取符号名称(文字)?【英文标题】:How can I obtain Symbol names (literals)? 【发布时间】:2018-06-19 17:51:50 【问题描述】:

以下情况:

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() ]

【问题讨论】:

为什么不将名称作为值,而不是对内部值的符号引用,这是不可读的。 嗨@Nina,在实际用例中它不是这样的对象,它是一个当前移动的 div 框,我使用了一个简短(可能毫无意义)的示例,..所有我必须知道的是:我怎样才能得到名字,.. 【参考方案1】:

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

var isMoving = Symbol("isMoving");

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

Symbol(isMoving)

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

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

【讨论】:

console.log() 显示的确切内容可能取决于浏览器,但描述的概念是它对调试可见,因此控制台肯定应该显示它。 谢谢@Pointy,你也可以告诉我,我怎样才能得到这些名字? (我不想得到“Symbol(isMoving)”,目前没问题的是,我想得到符号属性名als数组(类似于Object.getOwnPropertyNames等) @Lonely Use .toString() 用于符号名称,Object.getOwnPropertySymbols 用于符号列表。 @Bergi 你能给我举个例子吗? 谢谢,可惜没有原生解决方案,map + toString 不是优雅的解决方案,..【参考方案2】:

您遇到问题的原因是 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))

更新符号现在有一个 .description 属性,您可以使用它来代替调用 toString 并去除多余的字符。

console.log(Symbol('mySymbol').description)

结论

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

【讨论】:

【参考方案3】:

正如@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!"

【讨论】:

以上是关于如何获取符号名称(文字)?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取目标文件中类成员的符号?

GDB Python API:从地址获取符号名称

Android Currency 类 - 如何获取货币的显示名称?

如何按名称查找包含表情符号 Discord 的频道?

as3.0如何获取字符串中的某个符号前面和后面的字符串

如何在网页开发中获取图层操作的信息?