Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript空对象大小_Javascript_Object_Memory - Fatal编程技术网

JavaScript空对象大小

JavaScript空对象大小,javascript,object,memory,Javascript,Object,Memory,JavaScript中空对象的内存占用是多少?如果使用对象文字语法创建对象: let emptyObj = {}; 在GoogleChromeDeveloperTools(Profiles选项卡)中,在拍摄快照后,它显示浅层大小和保留大小等于56字节。 此外,如果对象是通过以下方式创建的,则存在相同的大小: let emptyObj = Object.create(null); 对我来说,这太多了,因为我在代码执行期间创建了很多对象(不一定是空的,但大多数只有很少的属性),我必须将它们存储在

JavaScript中空对象的内存占用是多少?如果使用对象文字语法创建对象:

let emptyObj = {};
在GoogleChromeDeveloperTools(Profiles选项卡)中,在拍摄快照后,它显示浅层大小和保留大小等于56字节。 此外,如果对象是通过以下方式创建的,则存在相同的大小:

let emptyObj = Object.create(null);
对我来说,这太多了,因为我在代码执行期间创建了很多对象(不一定是空的,但大多数只有很少的属性),我必须将它们存储在内存中。我假设,如果可以减小空对象的大小,也可以将具有属性的对象的大小减小相同的字节数

例如,如果对象看起来像这样:

let foo = {bar: 4};
它的大小为56(空对象开销)+6(键)+8(值)=70字节,那么将空对象的大小减少40字节将导致foo的大小为30字节(16+6+8)


这是对Chrome的空对象大小的正确解释吗?有可能减少吗?这会导致非空对象的大小减小吗?

空对象不是那么空。
如果您执行
emptyObj.\uuuuu proto\uuuu=null
操作,它将删除
\uuuuu proto\uuu
链。但是,对于
Object
的一些基本方法,它可能会抛出错误。但是,简单的属性分配和属性读取将很好地工作。希望它能为您节省一些字节。

“有可能减少吗?”没有。您无法控制浏览器如何解释“创建对象”操作,以及它在计算机内存中实际存储了什么来表示该操作。一般来说,不要再担心JS中的对象大小了,页面和web应用程序会使用成百上千的对象。只是别忘了删除对不再需要的对象的引用,GC将完成其余的工作。@proxeld只需存储它们,看看性能会受到什么影响。您可以从中进行优化,包括是否应该将它们全部存储在内存中,还是可以逐步创建它们,以及通过删除对未使用对象的引用来确保使用GC。同样,一般来说,不要太担心内存,除非你真的创造了一个内存猪。如果出于某种原因,我不得不渲染这数百万个对象中包含的信息,我会更担心。你的对象是否具有所有相同的属性,并且所有的道具都是基本类型(int、float、boolean)?也许还不错。实现起来可能有点痛苦,但您可以存储所有对象,在单个数组中展开,甚至更好,预分配的ArrayBuffer。有点像C结构数组在malloced时的布局。@proxeld只保存diff而不是完整状态,每存储100个条目就存储一个完整状态。根据每次迭代状态的变化程度,这可能会极大地减少内存占用,并且由于“关键帧”,您可以在合理的时间内重新创建每个状态。
\uuu proto\uu
不是对象的自有属性。您不能
删除它。如果你不明白它是如何工作的,请不要使用它。不管怎样,它已经被弃用了。使用
Object.setPrototypeOf
/
Object.getPrototypeOf
代替。如果想要一个真正的空对象,只需使用
Object.create(null)
实例化它即可。不要弄乱现有对象的原型链。无论如何,指向
对象的[[prototype]]链接与指向
null
的[[prototype]]链接之间的对象大小几乎没有内存差异。天才做他知道的事,天才做他想做的事。在这种特殊情况下,您可以删除原型链,以减少使用的内存量。然而,如果你删除
\uuuuu proto\uuuuuu
,你就不能使用对象的一些内部方法,你必须知道这样做的后果。@Bergi如果你不敢于绕过
禁忌
并打破常见规则,你就永远不会是一个好的程序员。