JavaScript数组保留未定义的元素

JavaScript数组保留未定义的元素,javascript,arrays,Javascript,Arrays,在google chrome控制台中,如果我初始化数组: var arr = []; arr[5] = 10; 然后在控制台中打印arr,显示: [undefined × 5, 10] 未定义x5它只是chrome的表示还是实际内存 保留的 arr[4]和arr[6]as之间有什么区别 两种打印都未定义 如果保留的未定义的x5实际上是保留空间,那么它有什么用 这意味着第六个条目是10 所有其他的都是空的(未定义) var arr=[]; arr[5]=10; console.log(arr

在google chrome控制台中,如果我初始化数组:

var arr = [];
arr[5] = 10;
然后在控制台中打印
arr
,显示:

[undefined × 5, 10]
  • 未定义x5
    它只是chrome的表示还是实际内存 保留的
  • arr[4]
    arr[6]
    as之间有什么区别 两种打印都未定义
  • 如果保留的
    未定义的x5
    实际上是保留空间,那么它有什么用

  • 这意味着第六个条目是
    10

    所有其他的都是空的(
    未定义

    var arr=[];
    arr[5]=10;
    
    console.log(arr[4])
    如果为x赋值。当前为空的数组的索引, 将更新数组长度

    见:,上面写着:

    在JavaScript数组上设置属性时,如果该属性是有效的数组索引且该索引超出数组的当前边界,则引擎将相应地更新数组的length属性

    在这种情况下,数组的长度将为6,因为您正在分配数组中的第6个位置。其余所有索引将携带
    null

    下面的示例将为您提供更好的想法:
    var arr=[];
    arr[5]=10;
    document.getElementById('element').innerHTML=JSON.stringify(arr)
    
  • 未定义的X5是否只是chrome的表示或实际保留的内存
  • 没有

    您正在描述的内容称为稀疏数组。在Javascript中,数组本质上是稀疏的。
    arr[5]
    的存在并不意味着
    arr[0]
    的存在。内存分配不到最大索引

    可以将Javascript中的数组视为对象类型。关键是索引。事实上,你甚至可以这样做:

    arr[3.14] = 'pi';
    
    3.14
    是键,
    pi
    是值。键/值对。它类似于声明此对象:

    var arr = { '3.14': 'pi' }
    
    不存在的属性也不存在

    数组的不同之处在于它们是数组,这意味着它们有索引并且是基于零的。因此,对于索引(读取键)
    0
    n
    ,值是
    未定义的

    如果你做了一个
    arr[200000]=“something”
    ,这并不意味着
    0
    19999
    会浪费内存

  • arr[4]和arr[6]之间的区别是什么,因为两种打印都未定义
  • 没有区别。“未定义”是指未定义。在Javascript中,您可以很好地引用远远超出声明的最大值的索引,并且没有超出范围的内容。你只能得到“未定义”

  • 如果它实际上是保留空间,那么保留的未定义x5有什么用
  • 这可能既方便又不方便。这取决于你怎么看。关于保留空间,请参见上文第1点

    您可以通过迭代数组来轻松验证这一点。参见下面的小示例,您将了解到
    0
    4
    之间不存在

    例如:

    //仅用于片段演示
    console.log=function(txt){var result=document.getElementById(“结果”);result.innerHTML+=txt+“
    ;” //迭代稀疏数组的演示 var-arr=[]; arr[5]=10; arr.forEach(函数(elem,idx){ console.log(idx+“=”+elem); });
    FF输出中的

    比较干净:数组[,10],因此它是同一事物的不同浏览器表示形式…console.log依赖于浏览器,但
    未定义的
    null
    是不同的原语
    undefined===null
    导致false,而
    typeof null
    导致“object”。在这种情况下,JSON不能存储undefined,它将存储null。
    arr[4]
    arr[6]
    的实际值未定义,因为您没有在任何地方定义它。在任何浏览器中,此行为都不会改变..
    JSON.stringify
    与稀疏数组无关。它事先不知道要序列化的数组是否有漏洞。它只是使用
    length
    进行迭代,并报告不存在的属性的
    null
    。事实上,数组中不存在元素,仅此而已。@Abhitalks,使用
    JSON.stringify
    的目的就是演示数组中的长度和值。如果我们定义长度或数组而不真正添加值,然后该值保持未定义,这就是我要显示的。如果我指定
    arr[999]=10
    arr.length
    表示1000。这是否意味着,
    arr
    保留999个
    undefined
    元素?消息前面的“undefined”与数组中的数据无关。但是,如果在未提供数据的情况下为数组[0]执行console.log,则会导致未定义。没有像C数组那样保留内存,因为JavaScript数组只是一个列表,并保存对其元素的引用(“指针”)。但是,类型化数组是不同的。他们不允许像非类型的稀疏数组那样出现间隙/孔洞。这是一个非常技术性的主题(对于像我这样的业余爱好者来说),但我可以问一下为什么:数组长度是6吗?@nevermind:那是因为它是一个数组。数组与对象的不同之处在于它们具有索引并且是基于零的。因此,数组的长度将是最高索引+1。但是,间隙是很好的,未定义。好的,谢谢,所以内存没有分配(不保留空格),内存中没有5个默认值为未定义的变量。如果我这样做:var first=arr[0];如果我理解正确,那么应该保留内存空间(默认值:未定义)?是@nevermind,现在您显式声明了一个变量。@abdul wahab:(1)
    arr[4.5]
    不可枚举,因为它现在是一个对象。但是,您仍然可以在
    语法中使用
    for..进行迭代。但是,这是现在