以下情况:
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() ]
答案 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
中。
这三个变量名称中没有一个真正附加到符号上。
更重要的是,alpha
和beta
在分配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!"