在babel-preset-stage-0
中,我们可以声明静态类变量如下:
class Constants {
static COUNTRY = Object.freeze({
NAME: 'Germany',
DESCRIPTION: 'placeholder',
})
}
使用Constants.COUNTRY
作为ES6 Map
或Set
的关键是否安全?
例如。
const map = new Map();
map.add(Constants.COUNTRY, something);
是否保证map.get(Constants.COUNTRY)
始终会返回something
?
性能与使用字符串一样好吗?对Constants.COUNTRY
使用eventKey
作为NavItem
(引导程序组件属性)是否安全?
将它声明为变量而不是类是否更合适? 即。
const Constants = Object.freeze({
COUNTRY: Object.freeze({
NAME: 'Germany',
DESCRIPTION: 'placeholder',
})
})
答案 0 :(得分:2)
是否可以保证map.get(Constants.COUNTRY)将始终返回一些内容?
要使map.get(Constants.COUNTRY)
始终返回原始值,必须有几件事情。
您必须确保永远不会为Constants.COUNTRY
分配不同的值,因为.COUNTRY
属性已重新分配,或者Constants
对象已替换为其他内容有一个不同的.COUNTRY
属性值。
您必须确保没有人能够从map
对象中删除该密钥。
如果您能确定这两件事,那么是map.get(Constants.COUNTRY)
将始终返回您想要的值。但是,如果其中任何一个不一定是真的,那么你不能确保总是从地图上获得你的价值。
您可以通过冻结Constants.COUNTRY
对象或将该属性设置为可配置为无法删除或写入来确保无法更改Constants
。为确保无法替换Constants
对象,最好将其作为第二个代码块中的const
。
我不知道如何确保没有人可以调用map.delete(Constants.COUNTRY)
,除非将map
对象设为私有,因此外国代码无法访问它。
如果您有任何理由想要阻止枚举地图中的键(以使某人更难以发现某个键),那么您可以使用WeakMap
代替{{1} }。
性能与使用字符串一样好吗?
您必须测试特定的Javascript实现以确保性能。没有必要的实现原因,一个或另一个应该更快 - 它将取决于实现的内部。
我创建了一个jsPerf test case来比较字符串查找和对象查找。欢迎反馈改进如何测试/测量,但使用当前的方案,我在地图中创建10,000个字符串键和10,000个对象键,然后比较每个访问1000,我发现不同的结果。
Map
将它声明为变量而不是类是否更合适?
如上所述,您的第二个Chrome is ~20% slower to access the object keys.
Firefox is ~20% slower to access the string keys.
Edge is ~27% slower to access the string keys.
表单的优势在于无法重新分配const
。
答案 1 :(得分:0)
您可以将WeakMap
用作COUNTRY
作为键,将something
作为值。使用const
声明的变量无法删除。在您使用Object.freeze()
时,wm.get(COUNTRY)
应始终返回something
const wm = new WeakMap;
const COUNTRY = Object.freeze({
NAME: 'Germany',
DESCRIPTION: 'placeholder',
});
wm.set(COUNTRY, "something");
// error when "use strict"
delete wm;
delete COUNTRY;
COUNTRY.NAME = 123;
console.log(
wm.get(COUNTRY)
);
console.log(
COUNTRY
);
console.log(
wm
);

如果要求是无法删除或更改的变量,您可以使用const
,请参阅Is it possible to delete a variable declared using const?和JSON
"use strict";
// `Constants` cannot be changed or deleted
const Constants = `{
"NAME": "Germany",
"DESCRIPTION": "placeholder"
}`;
console.log(
JSON.parse(Constants)
);
// delete Constants;
/*
Error: {
"message": "Uncaught SyntaxError: Delete of an unqualified identifier in strict mode."
}
*/