我正在用Javascript重建一个旧的Java项目,并意识到在JS中没有好的方法来做枚举.
我能想到的最好的是:
const Colors = {
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN: Symbol("green")
};
Object.freeze(Colors);
Run Code Online (Sandbox Code Playgroud)
的const保持Colors被重新分配,并冷冻它防止突变的键和值.我正在使用符号,这Colors.RED是不等于0,或除了它自己之外的任何其他东西.
这个配方有问题吗?有没有更好的办法?
(我知道这个问题有点重复,但以前的Q/As都很老了,ES6给了我们一些新功能.)
编辑:
另一个解决序列化问题的解决方案,但我认为仍存在领域问题:
const enumValue = (name) => Object.freeze({toString: () => name});
const Colors = Object.freeze({
RED: enumValue("Colors.RED"),
BLUE: enumValue("Colors.BLUE"),
GREEN: enumValue("Colors.GREEN")
});
Run Code Online (Sandbox Code Playgroud)
通过使用对象引用作为值,可以获得与Symbols相同的冲突避免.
假设我有一个符号,如const sym = Symbol('foo');.现在,有没有办法foo从该符号中获取值而不依赖于字符串操作?
我期待sym.toString()回来,'foo'但它会回来Symbol(foo).
我找到了这个hacky解决方案,直到找到一个更好的解决方案:)
const key = Symbol.keyFor(sym) || (sym = sym.toString(), sym.substring(7, sym.length - 1));
Run Code Online (Sandbox Code Playgroud) 以下情况:
var myVehicle = { brand: 'Tesla' };
var isMoving = Symbol();
var currentStatus = Symbol();
myVehicle[isMoving] = true;
myVehicle[currentStatus] = 'moving';
Run Code Online (Sandbox Code Playgroud)
我想在我的对象中打印使用过的“符号属性”的名称 myVehicle
console.log(
myVehicle[isMoving], // true
myVehicle[currentStatus], // 'moving',
Reflect.ownKeys(myVehicle), // [ 'brand', Symbol(), Symbol() ]
Object.getOwnPropertySymbols(myVehicle), // [ Symbol(), Symbol() ]
);
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到这样的名字:
[isMoving, currentStatus] 代替 [ Symbol(), Symbol() ]
我有一个用Javascript定义的具有相同值的String和SymbolHello, Stack Overflow!。我如何比较它们的平等性?我在下面尝试过的所有比较都返回false。
var string="Hello, Stack Overflow!";
var symbol=Symbol("Hello, Stack Overflow!");
console.log(string == symbol);
console.log(string == symbol.toPrimitive);
console.log(string == symbol.toString);
console.log(string == symbol.toStringTag);
console.log(string === symbol);
console.log(string === symbol.toPrimitive);
console.log(string === symbol.toString);
console.log(string === symbol.toStringTag);Run Code Online (Sandbox Code Playgroud)
javascript ×4
symbols ×3
comparison ×1
ecmascript-6 ×1
enums ×1
immutability ×1
node.js ×1
string ×1