尽管在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']
答案 0 :(得分:3)
我应该在日常代码中使用Object.freeze作为consts吗?
是,我认为这是一个很好的做法。它确实给你带来与const
相同的优点 - 失败而不是犯错(当然是在严格的模式下)。它也是一种更具声明性的代码风格,清楚地说明了该对象不应该被改变的意图。
然而,iirc冷冻物体仍然比正常物体慢一点。如果你有真正的性能关键代码,你必须知道这一点。它不应该阻止你使用Object.freeze
,尽管 1 。
但是,您不应该依赖于访问冻结对象时抛出的异常。您可能需要将代码转换为不支持冻结的ES3。
1)每天使用的人越多,引擎就会越早优化它 - 它已经过期了 - )