我应该在ECMAScript 2015中的const上使用Object.freeze吗?

时间:2015-07-03 11:39:25

标签: ecmascript-6

尽管在ECMAScript 2015中无法分配const,但如果对象未被Object.freeze冻结,则可以修改该对象。

由于const应该是不可变的,添加Object.freeze来冻结对象是否有意义?
大多数用例在声明后不需要内容可修改。我想到的一个例外是将class分配给const(例如const MyClass = class MyClass {}),在这种情况下,属性 需要更改(至少对于大多数用途)。

我不是在谈论ECMAScript 2015是否应该改变;我想知道是否应该在日常代码中使用Object.freeze作为const

实施例

const firstNames = ['John', 'Daisy'];

firstNames = []                 // Fails silently
firstNames                      // => ['John', 'Daisy']

firstNames[0] = 'Replaced!';    // No error and it works!
firstNames                      // => ['Replaced!', 'Daisy']

Object.freeze

的示例
const firstNames = Object.freeze(['John', 'Daisy']);

firstNames = []                 // Throws an error
firstNames                      // => ['John', 'Daisy']

firstNames[0] = 'Replaced!';    // No error and it works!
firstNames                      // => ['Replaced!', 'Daisy']

1 个答案:

答案 0 :(得分:3)

  

我应该在日常代码中使用Object.freeze作为consts吗?

,我认为这是一个很好的做法。它确实给你带来与const相同的优点 - 失败而不是犯错(当然是在严格的模式下)。它也是一种更具声明性的代码风格,清楚地说明了该对象不应该被改变的意图。

然而,iirc冷冻物体仍然比正常物体慢一点。如果你有真正的性能关键代码,你必须知道这一点。它不应该阻止你使用Object.freeze,尽管 1

但是,您不应该依赖于访问冻结对象时抛出的异常。您可能需要将代码转换为不支持冻结的ES3。

1)每天使用的人越多,引擎就会越早优化它 - 它已经过期了 - )