2016-10-08 50 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