数组真的是“分隔”的吗?默认情况下在JavaScript中

Are Arrays really "sparsed" in JavaScript by default?

本文关键字:情况下 默认 JavaScript 的吗 真的 分隔 数组      更新时间:2023-09-26

数组在JavaScript默认情况下真的是"sparsed"吗?

如何删除没有索引移位的单个数组元素?

var a = new Array(10);
var b = new Array(2);

这些数组占用不同的内存空间吗?我能把Array(2)变成Array(10)再变回来吗?

更新1

以下代码

<body>
<script type="text/javascript">
    var a = new Array(10);
    var b = new Array(2);
    document.write('a[5] is ' + a[5] + '<br/>');
    document.write('a[15] is ' + a[15] + '<br/>');
    document.write('a.length is ' + a.length + '<br/>');
    document.write('b[5] is ' + b[5] + '<br/>');
    document.write('b[15] is ' + b[15] + '<br/>');
    document.write('b.length is ' + b.length + '<br/>');
    b[9]=12;
    delete b[9];
    document.write('After resize...<br/>');
    document.write('b[5] is ' + b[5] + '<br/>');
    document.write('b[15] is ' + b[15] + '<br/>');
    document.write('b.length is ' + b.length + '<br/>');
</script>
</body>

将返回

a[5] is undefined
a[15] is undefined
a.length is 10
b[5] is undefined
b[15] is undefined
b.length is 2
After resize...
b[5] is undefined
b[15] is undefined
b.length is 10

因此,我使b具有与a相同的性质。我可以这样做,而不分配假值b[9] ?我可以做反转,即有a.length是2吗?

  1. 是的,数组默认是稀疏的。它们的属性甚至没有定义。您可以用下面的代码进行测试:

    var arr = new Array(10);
    for(var x in arr) {
        alert(x); // Never alerts a number
    }
    
  2. 删除单个元素,使用delete:

    delete arr[5]; // Deletes element 6.
    
  3. 内存可能无关紧要,不同的引擎会以不同的方式处理它。我认为这个问题无法准确回答。至于改变维度,JavaScript数组没有固定的维度。这是完全合法的:

    var arr = new Array(2);
    arr[5] = "Hello!";
    

你可以在http://developer.mozilla.com/上阅读更多关于JavaScript的信息。数组只是具有一些额外特殊属性的对象。索引没有键那么多

是的,索引只是对象的常规属性。

如果我做…

var array = new Array();
array[1000] = null;

…只有一个属性被添加到数组中,尽管它的length将被更新为1001


如果要删除单个索引,则使用delete

delete a[5];

示例中的两个数组是唯一的对象。我不知道你把一个变成另一个是什么意思