2017-05-27 42 views
0
var Arr1; 
var Arr2 = []; 

(假设ARR1开始作为一个未定义的变种,后来它成为一个数组根据需要)(Javascript)空数组的内存开销vs未定义的var?

会ARR1的十亿具有相同的内存占用为ARR2的十亿?它们在技术上都是空的,但是Arr2是一个对象,这意味着在对象本身的定义中必定存在一些开销。不是?

+0

不一样的语言,但程序相同:https://stackoverflow.com/a/2430672/6634591 – Luca

+0

真正的问题应该是应用程序设计要求您在内存中有成千上万的未使用的数组? – ste2425

+1

@ ste2425:没关系。在考虑到效率的情况下进行设计时,我们总是会遇到边界条件,看看发生了什么。不过,我也可以举一个例子:假设我们有一个WebGL游戏,其中每个屏幕对象可以是线条,折线,曲线和曲面的集合,但是假设今天所有的屏幕对象都是100万个曲面,不想要未使用的行/折线/曲线,对象属性添加太多的内存占用。 –

回答

2

var Arr1创建了一个内存占用空间,该占用空间没有任何引用。所以,是的,这样做有一定的成本,但它很小。

但是,var Arr2 = []会创建一个内存地址,该地址持有对新Array对象的引用,因此这里存在更多的占用空间。即使数组为空,它也是Array对象的唯一实例,它本身使用单个的Array.proototype来继承。数组中的人口真的会占用内存,因为即使10亿个空数组也不需要存储任何尚未被Array.prototype存储的内容。即使有10亿个空阵列,它们也只是从一个Array.prototype对象继承而来,这就是存储数组的本地API的地方。

+0

很好的解释 –

+0

我问的原因是(来自C++背景)一个对象的十亿个实例,即使是空的,仍然占用堆栈中的空间,因为每个实例都需要空间来定义自己和自己的私有变量,等等。我不确定一个数组是如何在Javascript内部实现的,以及每个空数组实例变量需要多少个字节。 –

+0

实际存储空间将根据实施情况而有所不同。但是,这个过程是相似的,除了您创建的数组元素和任何其他属性将与新数组一起存储。所有的基本功能只在原型中存储一次。 –