我有一个数组:
mydata =[];
我通过使用可能有点大的数字键将值存储在数组中
mydata[13525] = 1;
但是,如果我只存储上面的一个项目,当我在控制台中打印数组时,它会在对象之前打印13524个逗号,但是调试器告诉我它的长度为13526,并且数组中只有一个元素。 / p>
我很困惑,因为我知道JS数组并不需要填充每个位置,当然这可能会消耗大量的内存。你能解释一下吗?
答案 0 :(得分:1)
数组的.length
属性表示最高索引加上已分配值的数组中的一个。
如果不分配中间值(因此具有稀疏数组),则未分配的中间值为undefined
,这实际上是Javascript中的“此处没有”值。控制台选择通过尝试显示0
和数组末尾之间的每个值来显示数组,这显然不是显示大部分为空的稀疏数组的好方法。这更像是控制台中设计选择的工件而不是其他任何东西。可以设计一种不同的方式来显示可以不同方式处理稀疏数组的数组内容。
如果使用从0
开始的连续索引,则数组效率最高。这就是他们最常设计的内容,以及许多实现的优化,因为运行时可以做一些优化的事情,如果它知道有一组连续的值。
如果你知道你大部分时间都没有使用从0
开始的数字索引序列,因此.length
属性对你来说没用,那么也许是一个任意的普通对象属性是一个更好的选择。
var mydata = {};
mydata[13525] = 1;
console.log(mydata[13525]); // 1
console.log(mydata.length); // undefined - no .length property on an object
console.log(myData); // {1: 13525}
答案 1 :(得分:0)
如果您只想在数组中打印任何非空值,而不是打印整个数组,我将使用仅打印非空值的for循环。它是这样的......
for (i = 0; i < mydata.length; i++) {
if(mydata[i]!= null){
console.log(mydata[i]);
}
}
答案 2 :(得分:0)
javascript数组与其他数据有点不同,
var foo = [1, 2, 3, 4, 5, 6];
foo.length = 3;
foo; // [1, 2, 3]
foo.length = 6;
foo.push(4);
foo; // [1, 2, 3, undefined, undefined, undefined, 4]
虽然length属性的getter只返回数组中包含的元素数,但在setter中,较小的值会截断数组,较大的值会创建稀疏数组。猜猜setter mydata[13525] = 1;
会做什么。
编辑:
打印/仅使用当前值,您可以
mydata.forEach(function(v){console.log(v);});