2015-07-03 33 views
4

尽管在ECMAScript 2015中无法分配const,但如果该对象未被Object.freeze冻结,则该对象可以被修改。我应该在ECMAScript 2015的常量上使用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'] 

回答

3

例子我应该使用Object.freeze在日常代码consts?

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

然而,iirc冷冻物体仍然比普通物体慢一些。如果你有真正关键的代码,你必须知道这一点。一般来说,它不应该阻止您使用Object.freeze,尽管。

但是,您不应该依赖访问冻结对象时引发的异常。很可能您必须将您的代码转储到不支持冻结的ES3。

1),越来越多的人每天都使用它,越早引擎将优化这一点 - 它的逾期IMO :-)

+0

是,冻结对象真的,真的** **应优化 - 这是一个你可以做的最简单的(至少在理论上)优化。 – Toothbrush