JavaScript Array保留未定义的元素

时间:2015-09-18 09:38:15

标签: javascript arrays

在Google Chrome控制台中,如果我初始化一个数组:

var arr = [];
arr[5] = 10;

然后在控制台中打印arr说:

[undefined × 5, 10]
  1. undefined x 5只是chrome的表示或实际内存 保留?
  2. arr[4]arr[6]之间的区别是什么? 两者都打印undefined
  3. 保留undefined x 5的用途是什么,如果它实际上是预留空间?

4 个答案:

答案 0 :(得分:1)

如果为x指定值。当前为空的数组的索引, 数组长度将更新。

请参阅:Array at MDN,其中说:

  

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

答案 1 :(得分:1)

  
      
  1. undefined x 5是否只保留chrome的表示或实际内存?
  2.   

没有。

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

您可以在Javascript中看到一个Object类型的数组。键是索引。事实上,你甚至可以这样做:

arr[3.14] = 'pi';

3.14是关键,pi是值。键/值对。它类似于声明此对象:

var arr = { '3.14': 'pi' }

不存在的属性,不存在。

阵列的不同之处在于它们是数组,这意味着它们具有索引并且从零开始。因此,对于索引(读取密钥)0n,值为undefined

如果您执行了arr[200000] = 'something',并不意味着0通过19999将会在那里浪费内存。

  
      
  1. arr [4]和arr [6]之间的区别是什么,因为两个打印都未定义?
  2.   

没有区别。嗯,"未定义"表示未定义。在Javascript中,您可以很好地引用超出声明的最大值的索引,并且没有越界东西。您只能获得" undefined"

  
      
  1. 使用保留的未定义的x 5是什么,如果它实际上是预留的空间?
  2.   

这可能既方便又不方便。只取决于你如何看待它。关于预留空间,没有。见上文第1点。

您可以通过迭代数组轻松验证这一点。请参阅下面的小示例,您将了解04不存在。

示例:



// Only for snippet demo
console.log = function(txt) {  var result = document.getElementById("result"); result.innerHTML += txt + "<br/>"; }
                             
// demo to iterate sparse array
var arr = [];
arr[5] = 10;

arr.forEach(function(elem, idx) {
    console.log(idx + " = " + elem);
});
&#13;
<p id="result"></p>
&#13;
&#13;
&#13;

也有类型化的数组。这些不是稀疏数组,因此您不能引入类型数组的间隙。例如:

var int16 = new Int16Array(2);

答案 2 :(得分:0)

这意味着第六个条目是10

所有其他都是空的(undefined)。

var arr = [];
arr[5] = 10;
console.log(arr[4])

答案 3 :(得分:0)

  

在这种情况下,当您在数组中分配第6个位置时,数组的长度将为6。休息所有索引将带有null值..

以下示例将为您提供更好的建议:

&#13;
&#13;
var arr = [];
arr[5] = 10;
document.getElementById('element').innerHTML = JSON.stringify(arr);
&#13;
<div id='element'></div>
&#13;
&#13;
&#13;