默认情况下,数组中的数组是否真的被“解析”了?

时间:2011-12-24 20:13:02

标签: javascript arrays sparse-matrix

默认情况下,数组中的数组是否真的被“解析”了?

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

有什么区别:

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吗?

2 个答案:

答案 0 :(得分:4)

  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!";
    
  4. 您可以在http://developer.mozilla.com/上详细了解JavaScript。数组只是具有一些额外特殊属性的对象。它并没有像钥匙那样真正拥有索引。

答案 1 :(得分:1)

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

如果我......

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

...只有一个属性添加到数组中,但其length将更新为1001


要删除没有重新索引的单个,请使用delete

delete a[5];

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