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

时间:2017-07-21 03:28:49

标签: 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使用eventKey作为NavItem(引导程序组件属性)是否安全?

将它声明为变量而不是类是否更合适? 即。

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

2 个答案:

答案 0 :(得分:2)

  

是否可以保证map.get(Constants.COUNTRY)将始终返回一些内容?

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

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

  2. 您必须确保没有人能够从map对象中删除该密钥。

  3. 如果您能确定这两件事,那么是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."
}
*/