2016-10-08 49 views
7

JavaScript中空對象的內存佔用情況如何?JavaScript空對象大小

let emptyObj = {}; 
在谷歌Chrome開發者工具(配置文件選項卡)

,取快照之後,它表明淺大小以及留存面積等於56:如果對象是使用對象文本語法創建字節。 此外,相同的尺寸存在,如果對象是通過創建:

let emptyObj = Object.create(null); 

對於我來說,這是太多,因爲我創造了很多的對象(不一定是空的,但大多隻有少數屬性)中代碼執行,我必須將它們存儲在內存中。我假設如果可以減少空對象大小,也可以通過相同數量的字節來減小具有屬性的對象的大小。

例如,如果對象看起來像這樣:

let foo = {bar: 4}; 

並且其具有的尺寸,讓我們說,56(空的對象開銷)+ 6(鍵)+ 8(值)= 70字節,由40個字節的空對象的然後還原大小將導致具有30個字節(16 + 6 + 8)的大小FOO

這是Chrome的空對象大小的正確解釋?有可能減少它嗎?它會導致非空對象的大小減小嗎?

+4

「可以減少它嗎?」不可以。您無法控制瀏覽器如何解釋「創建對象」操作以及它實際存儲在計算機內存中以表示該操作。一般情況下,只要不再擔心JS中的對象大小,頁面和Web應用程序就會使用數百甚至數千個字符。不要忘記刪除不再需要的對象的引用,GC將完成剩下的工作。 –

+0

語言規範([* ECMA-262 *](http://ecma-international.org/ecma-262/7.0/index.html))沒有定義實現,所以內存佔用可能會因實現而有所不同。使用對象文本創建對象應該返回與使用對象構造函數創建對象完全相同的結果。 – RobG

+0

@MitchKarajohn不幸的是,我需要存儲數以百萬計的數據,我無法減少這個數量。所以我試圖找出如何減小每個對象的「基數」的大小。這會給我帶來巨大的記憶力。 – proxeld

回答

-2

空對象不是那麼空。 如果你這樣做emptyObj.__proto__ = null它將刪除__proto__鏈。但是,它可能會爲Object的一些基本方法拋出錯誤。然而,簡單的屬性分配和屬性讀取會很好。希望它能爲你節省一些字節。

+0

'__proto__'不是一個對象的屬性。你不能'刪除'它。如果你不明白它是如何工作的,請不要使用它。無論如何,它已被棄用。改爲使用Object.setPrototypeOf' /'Object.getPrototypeOf'。 – Bergi

+0

如果你想要一個真正的空對象,只需使用Object.create(null)'實例化它。不要混淆現有對象的原型鏈。 – Bergi

+0

在任何情況下,指向Object.prototype的[[prototype]]鏈接和指向null的[[prototype]]鏈接之間的對象大小几乎沒有內存差異。 – Bergi