Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中的数组实际上是用空格填充的还是打印时用零填充的?_Javascript_Arrays - Fatal编程技术网

Javascript JS中的数组实际上是用空格填充的还是打印时用零填充的?

Javascript JS中的数组实际上是用空格填充的还是打印时用零填充的?,javascript,arrays,Javascript,Arrays,我有一个数组: mydata =[]; 我使用一个可能有点大的数字键在数组中存储值 mydata[13525] = 1; 但是,如果我只存储一个如上所述的项,当我在控制台中打印数组时,它会在对象之前打印13524个逗号,然而调试器告诉我它的长度为13526,并且数组中只有一个元素 我很困惑,因为我知道JS数组并不要求每个位置都被填充,当然这可能会在较大的数字上消耗大量内存。你能解释一下吗?数组的.length属性表示数组中已赋值的最高索引加上一个索引 当您没有分配中间值(因此有一个稀疏数组)

我有一个数组:

mydata =[];
我使用一个可能有点大的数字键在数组中存储值

mydata[13525] = 1;
但是,如果我只存储一个如上所述的项,当我在控制台中打印数组时,它会在对象之前打印13524个逗号,然而调试器告诉我它的长度为13526,并且数组中只有一个元素


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

数组的
.length
属性表示数组中已赋值的最高索引加上一个索引

当您没有分配中间值(因此有一个稀疏数组)时,您没有分配的中间值是
undefined
,这本质上是Javascript中的“nothing here”值。控制台通过尝试显示
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]);
    }
}
(i=0;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中,较小的值截断数组,较大的值创建稀疏数组。猜一下setter
mydata[13525]=1就可以了

src:


编辑:

要仅打印/使用当前的值,可以执行以下操作

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

如何打印阵列?console.log(mydata);