2015-07-03 62 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