使用JavaScript[]literal的数组长度真的反映了它在内存中的物理大小吗?

使用JavaScript[]literal的数组长度真的反映了它在内存中的物理大小吗?,javascript,arrays,object,Javascript,Arrays,Object,在JavaScript中,有两种方法定义数组: var array = new Array(); // which is not preferred 及 [编辑以纠正误解] 事实上,无论我使用[]还是new Array(),它们都是对象,因为我们可以定义 var object = []; object["key"] = "value"; console.log(object.key); // gives "value" 我想知道如果我使用[]定义一个“数组”,如果我有以下代码,物理大小是多少

在JavaScript中,有两种方法定义数组:

var array = new Array(); // which is not preferred

[编辑以纠正误解] 事实上,无论我使用[]还是new Array(),它们都是对象,因为我们可以定义

var object = [];
object["key"] = "value";
console.log(object.key); // gives "value"
我想知道如果我使用[]定义一个“数组”,如果我有以下代码,物理大小是多少:

var array = [];
array[1000] = "value";
如果其行为类似于对象,则其物理大小应仅由键值对[1000]->“值”组成。但是,如果我使用
console.log(array.length)输出数组的length属性,它给出1001,就好像在我刚刚插入的[1000]->“value”之前有1000个元素一样

那么,使用[]定义的“数组”在内存中的物理大小应该是多少

From-
length属性表示一个无符号的32位整数,其数值总是大于数组中的最高索引。

对于元素大小,没有可调用的直接方法,但可以使用过滤器确定大小-

array.filter(function(value) { return value !== undefined }).length
var数组=[];
数组[1000]=“值”;
警报(array.filter(函数(值){return value!==undefined}).length)您的术语“物理尺寸”不清楚。你是说“数组中已定义元素的数量”吗?您使用了另一个不清楚的术语,即“实际尺寸”

就其“大小”而言,阵列(无论如何创建)具有以下特征:

  • 长度
    。这是包含值加1的最后一个元素的索引

  • 已定义元素的数量。这小于或等于长度。您可以通过执行类似于
    array.reduce(函数(n){return n+1;},0)
    的操作找到它,因为
    reduce
    跳过未定义的元素
    filter
    也可以,因此您也可以执行
    array.filter(function(){return true;}).length

  • 内部尺寸。正如一位评论者所提到的,这是特定于引擎的,您没有办法或理由看到这一点。不同的引擎有不同的策略来管理数组的内部表示,而且它们可能会在策略之间切换。因此,一个数组可以表示为一个连续的内存位置块,但当它达到特定的稀疏程度时,可能会将其表示形式更改为更适合稀疏数组的表示形式。如果认为阵列可能正在增长,它可能会预先分配内存块。因此,没有办法知道(或有理由担心)两个阵列“占用内存中相同的物理大小”


  • 在另一个主题上,您似乎对数组和对象之间的区别感到困惑
    []
    新数组()
    非常像数组。它们正是数组。但是,在JS中,数组继承所有对象行为。换句话说,数组是一种特殊的对象,它提供了诸如自动管理
    长度等功能,以及它们自己的原型方法。是的,数组是对象……就像JS中的所有东西一样。您可以将其视为一个类,它在对象之上扩展了对象,并具有自己的功能。这并不意味着它是一个数组

    而且数组在索引方面不仅仅是键/值对。这就是它成为数组的原因。如果在索引1000处放置某些内容,则需要将索引设置为0-1000,该数组才能具有该索引。是的,如果你在
    arr[1000]
    上赋值,那么总索引数会突然增加1001(1001,因为它从0开始索引)

    无论使用何种语法创建数组对象,这都是正确的。这两种语法都会创建相同类型的数组对象…只是不同的语法。有些人避免使用
    new Array()
    的唯一原因是,如果只给出一个正整数的参数,它会假定您的意思是要创建那么多空索引,而有些人会感到困惑。再说一遍,这只是语法而已



    诽谤者:当您设置索引1000时,您可以
    pop()
    将其关闭,然后结束,并且仍然将999作为最高索引,即使它未定义。无论是否为所有这些索引设置了值,就数组而言,在设置索引1000时,您创建了索引0-1000,并且它将这些索引视为数组中的实际索引,需要您使用数组方法将它们从数组中删除。就数组而言,0-999具有未定义的值这一事实并不会改变这一点。

    数组的
    .length
    属性是唯一真正特殊的属性,它的值总是比最大的数值属性集多1。也就是说,
    arr.foo='bar'
    不会影响
    .length
    属性,但
    arr[100]='bar'
    会影响。不过,两个赋值操作基本上都在做相同的事情,它们在对象上设置属性


    .length
    属性只允许您使用
    for(var i=0;i
    迭代数组,否则您无法知道何时停止迭代。您需要使用
    .push
    .pop
    以及确保索引连续或保持索引正常的操作数组;如果这样做,
    .length
    指向最高的数字索引加1正是唯一需要的行为


    然而,Javascript数组基本上只是稀疏对象,只要知道这种行为,就可以随意使用它们

    你的理解是错误的<代码>[]
    是一个数组。你的反例毫无意义,因为你也可以这样做:
    var-array=new-array();数组[“ke
    
    array.filter(function(value) { return value !== undefined }).length