在JavaScript中,有两种方法可以定义数组:
var array = new Array(); // which is not preferred
和
var array = [];
[编辑纠正误解]事实上,无论我使用[]还是新的Array(),它们总是对象,因为我们可以定义
var object = []; object["key"] = "value"; console.log(object.key); // gives "value"
我想知道如果使用[]定义一个"数组",如果我有以下代码,那么物理大小是多少:
var array = []; array[1000] = "value";
如果它的行为类似于一个对象,它的物理大小应该只由键值对[1000] - >"value"组成.但是,如果我使用输出数组的长度属性console.log(array.length);
,它给出1001好像在我刚刚插入的[1000] - >"值"之前有1000个元素.
那么使用[]定义的"数组"的内存中的物理大小应该是多少?
您的术语"物理尺寸"尚不清楚.你的意思是"数组中定义的元素的数量"?你使用另一个不明确的术语,即"实际大小".
数组(无论如何创建)在其"大小"方面具有以下特征:
length
.这是包含值加1的最后一个元素的索引.
已定义元素的数量.这小于或等于长度.您可以通过执行类似操作找到它array.reduce(function(n) { return n+1; }, 0)
,因为reduce
跳过未定义的元素.filter
也是,所以你也可以这样做array.filter(function() { return true; }).length
.
内部尺寸.作为一个提到的评论者,这是特定于引擎的,并且没有办法或理由让你看到这一点.不同的引擎具有用于管理阵列的内部表示的不同策略,并且它们可以在策略之间切换.因此,一个数组可能表示为连续的内存位置块,但是当它达到特定的稀疏程度时,可能会将其表示更改为更适合稀疏数组的表示.如果它认为阵列可能正在增长,它可能会预先分配内存块.因此,没有办法知道(或理由关心)两个阵列"在内存中占据相同的物理大小".
在另一个主题上,您似乎对数组与对象之间的区别感到困惑.[]
并且new Array()
是非常多的数组.它们就是阵列.但是,在JS中,数组继承所有对象行为.换句话说,数组是一种特殊的对象,它提供了诸如自动管理length
和自己的原型方法等功能.