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)
结论
- 变量有一个名称
- 变量将指向一个值
- 符号是一种价值
- 但值不会指向包含它的任何变量
- 因此,无法从值中获取变量名
- 但如果您想在调试时看到一些有用的东西,请给出符号描述
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框,当前正在移动,我使用了一个简短的(可能没有意义的)示例,…我所要知道的是:如何获得名称,。。