在Google Chrome控制台中,如果我初始化一个数组:
var arr = [];
arr[5] = 10;
然后在控制台中打印arr
说:
[undefined × 5, 10]
undefined x 5
只是chrome的表示或实际内存
保留? arr[4]
和arr[6]
之间的区别是什么?
两者都打印undefined
?undefined x 5
的用途是什么,如果它实际上是预留空间?答案 0 :(得分:1)
如果为x指定值。当前为空的数组的索引, 数组长度将更新。
请参阅:Array at MDN,其中说:
当属性是有效的数组索引并且该索引超出数组的当前边界时,在JavaScript数组上设置属性时,引擎将相应地更新数组的长度属性
答案 1 :(得分:1)
- undefined x 5是否只保留chrome的表示或实际内存?
醇>
没有。
您所描述的内容称为稀疏数组。在Javascript中,数组本质上是稀疏。 arr[5]
的存在并不意味着arr[0]
的存在。内存未分配到最大索引。
您可以在Javascript中看到一个Object类型的数组。键是索引。事实上,你甚至可以这样做:
arr[3.14] = 'pi';
3.14
是关键,pi
是值。键/值对。它类似于声明此对象:
var arr = { '3.14': 'pi' }
不存在的属性,不存在。
阵列的不同之处在于它们是数组,这意味着它们具有索引并且从零开始。因此,对于索引(读取密钥)0
到n
,值为undefined
。
如果您执行了arr[200000] = 'something'
,并不意味着0
通过19999
将会在那里浪费内存。
- arr [4]和arr [6]之间的区别是什么,因为两个打印都未定义?
醇>
没有区别。嗯,"未定义"表示未定义。在Javascript中,您可以很好地引用超出声明的最大值的索引,并且没有越界东西。您只能获得" undefined" 。
- 使用保留的未定义的x 5是什么,如果它实际上是预留的空间?
醇>
这可能既方便又不方便。只取决于你如何看待它。关于预留空间,没有。见上文第1点。
您可以通过迭代数组轻松验证这一点。请参阅下面的小示例,您将了解0
至4
不存在。
示例:
// 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;
也有类型化的数组。这些不是稀疏数组,因此您不能引入类型数组的间隙。例如:
var int16 = new Int16Array(2);
答案 2 :(得分:0)
这意味着第六个条目是10
,
所有其他都是空的(undefined
)。
var arr = [];
arr[5] = 10;
console.log(arr[4])
答案 3 :(得分:0)
在这种情况下,当您在数组中分配第6个位置时,数组的长度将为6。休息所有索引将带有
null
值..
以下示例将为您提供更好的建议:
var arr = [];
arr[5] = 10;
document.getElementById('element').innerHTML = JSON.stringify(arr);
&#13;
<div id='element'></div>
&#13;