JS中的数组实际上是填充了空格,还是打印时填充了零

Is an array in JS actually filled with empty spaces or when printed is it filled with zeros?

本文关键字:填充 打印 空格 实际上 JS 数组      更新时间:2023-09-26

我有一个数组:

mydata =[];

我使用可能有点大的数字键将值存储在数组中

mydata[13525] = 1;

但是,如果我只存储上述一个项目,当我在控制台中打印数组时,它会在对象之前打印 13524 个逗号,但调试器告诉我它的长度为 13526,数组中只有一个元素。

我很困惑,因为我知道 JS 数组不需要填充每个位置,当然这可能会在更大的数字上消耗大量内存。你能解释一下吗?

数组

.length 属性表示数组中已分配值的最高索引加 1。

当你不分配中间值(因此有一个稀疏数组)时,你没有分配的干预值是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}

如果您只想打印数组中的任何非空值,而不是打印整个数组,我会使用仅打印非空值的 for 循环。会是这样的...

for (i = 0; i < mydata.length; i++) { 
    if(mydata[i]!= null){
       console.log(mydata[i]);
    }
}

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 中,较小的值会截断数组,较大的值会创建稀疏数组。猜猜二传手mydata[13525] = 1;会怎么做。

src: Javascript Garden


编辑:

要仅打印/使用存在的值,您可以

 mydata.forEach(function(v){console.log(v);});