javascript - ES6 可以安全地使用静态类变量作为 Map 的键吗?

标签 javascript ecmascript-6 babeljs ecmascript-next

babel-preset-stage-0中,我们可以声明静态类变量如下:

class Constants {
  static COUNTRY = Object.freeze({
      NAME: 'Germany',
      DESCRIPTION: 'placeholder',
  })
}

使用 Constants.COUNTRY 作为 ES6 MapSet 的键是否安全?

例如。

const map = new Map();
map.add(Constants.COUNTRY, something);

是否保证 map.get(Constants.COUNTRY) 总是返回 something

性能是否与使用字符串作为键一样好?将 Constants.COUNTRY 用作 NavItemeventKey(引导组件属性)是否也安全?

声明为变量而不是类是否也更合适? 即

const Constants = Object.freeze({
  COUNTRY: Object.freeze({
      NAME: 'Germany',
      DESCRIPTION: 'placeholder',
  })
}) 

最佳答案

Is it guaranteed that map.get(Constants.COUNTRY) will always return something?

要使 map.get(Constants.COUNTRY) 始终返回您的原始值,有几件事必须为真。

  1. 您必须确保永远不会为 Constants.COUNTRY 分配不同的值,因为 .COUNTRY 属性已重新分配或因为 Constants 对象被替换为具有不同 .COUNTRY 属性值的其他对象。

  2. 您必须确保任何人都无法从 map 对象中删除该键。

如果您可以确保这两件事,那么 map.get(Constants.COUNTRY) 将始终返回您想要的值。但是,如果其中任何一个不一定为真,那么您将无法保证始终从 map 中获取您的值(value)。

您可以通过卡住Constants 对象或将该属性设置为可配置以确保无法更改Constants.COUNTRY 以使其无法删除或写入。为确保 Constants 对象无法被替换,最好将其设置为 const,就像您的第二个代码块中一样。

我不知道有什么方法可以确保没有人可以调用 map.delete(Constants.COUNTRY),除非将 map 对象设为私有(private),这样外部代码就无法调用开始吧。

如果你有任何理由想要阻止映射中的键的枚举(可能使某人更难发现键),那么你可以使用 WeakMap 而不是 map

Is the performance as good as using strings as key?

您必须测试特定的 Javascript 实现才能确保性能。没有必要的实现理由说明其中一个或另一个应该更快 - 它仅取决于实现的内部结构。

我创建了一个 jsPerf test case将字符串查找与对象查找进行比较。欢迎提供有关改进测试/测量方式的反馈,但使用当前方案,我在映射中创建 10,000 个字符串键和 10,000 个对象键,然后比较访问每个键的 1000 个,我发现不同的结果。

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.

Is it also more appropriate to declare it as a variable instead of a class?

正如所讨论的,您的第二个 const 表单具有无法重新分配 Constants 的优点。

关于javascript - ES6 可以安全地使用静态类变量作为 Map 的键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45228487/

相关文章:

javascript - 如何使用相同的组件值映射 2 个不同的数组?

javascript - 我无法理解 "Module not found: Error: Can' t 解析 'fs' '"

javascript - 不允许双引号的正则表达式不起作用

javascript - 如何使用运行本地 Tomcat 服务器的 Eclipse 调试 javascript

javascript - 如何在 ES6 中使弱集或弱映射可迭代?

javascript - 为什么我会在我的 React 组件中收到意外标记?

Javascript String.replace() ,结果不明确

javascript - 如何在不重新填充列表的情况下维护下拉列表的当前信息?

node.js - Babel + Mocha 堆栈跟踪报告错误的行号

javascript - 无法从 src 文件夹运行简单的 babel 到 dist