Javascript-使用空值初始化数组

Javascript-使用空值初始化数组,javascript,arrays,Javascript,Arrays,在Javascript中,为什么是 var myArray = new Array(3); 不同于: var otherArray = [null, null, null]; ? Obs:(myArray==otherArray)返回false 还有,我怎样才能得到一个像otherArray这样的变量,它是一个充满“null”的数组,但大小不限 Obs [undefined, undefined, undefined] 也不等于myArray。此var myArray=新数组(3)将创建

在Javascript中,为什么是

var myArray = new Array(3);
不同于:

var otherArray = [null, null, null];
?

Obs:
(myArray==otherArray)
返回
false

还有,我怎样才能得到一个像
otherArray
这样的变量,它是一个充满“null”的数组,但大小不限

Obs

[undefined, undefined, undefined] 

也不等于myArray。

var myArray=新数组(3)将创建一个空数组。因此,出于这个原因,
myArray
otherArray
是不同的数组。此外,即使它们有相同的值,三个
未定义的
值,数组也不会相同。数组是一个对象,变量
myArray
包含对该对象的引用。具有相同值的两个对象不相同

比如说,

var a = new Object();
var b = new Object();
console.log(a===b); // outputs false.
除此之外:

var customerA = { name: "firstName" };
var customerB = { name: "firstName" };
console.log(customerA===customerB); // outputs false.
更新

此外,在
var myArray=newarray(3)
的情况下,即使索引也没有初始化,正如Paul在他的评论中正确指出的那样

如果您尝试以下方法:

var array = [1,2,3];
console.log(Object.keys(array));
var array = new Array(3);
console.log(Object.keys(array));
您将得到以下输出:

["1","2","3"];
而如果您尝试以下操作:

var array = [1,2,3];
console.log(Object.keys(array));
var array = new Array(3);
console.log(Object.keys(array));
您将获得以下输出:

[]

需要注意的第一点是,如果要比较两个
数组
或任何其他
对象
,则必须对它们进行循环或序列化,因为比较引用总是给出
false


我怎样才能得到像otherArray这样的变量,它是一个充满“null”的数组,但大小不限

以下是另一种创建数组的方法,该数组的项目和所有索引都使用默认值进行初始化:

function createArray(len, itm) {
    var arr1 = [itm],
        arr2 = [];
    while (len > 0) {
        if (len & 1) arr2 = arr2.concat(arr1);
        arr1 = arr1.concat(arr1);
        len >>>= 1;
    }
    return arr2;
}
现在,

使用EcmaScript 6(ES2105),创建包含
五个空值的数组非常简单,如下所示:

const arr=新数组(5)。填充(null);

我做了一些研究,结果表明
数组(length).fill(null)
在性能方面不是最好的解决方案

最好的表现是:

const nullArr=数组(长度)
for(设i=0;i
看看这个:

const Benchmark=require('Benchmark'))
const suite=新的Benchmark.suite
常数长度=10000
一套
.add('Array#fill',function(){
数组(长度).fill(空)
})
.add('Array#for',函数(){
常量nullArr=数组(长度)
for(设i=0;i
它显示了以下结果:

Array#fill x 44545 ops/sec±0.43%(采样91次)
阵列#用于x 78789运算/秒±0.35%(采样94次)
最快的是阵列

您也可以尝试
[…新数组(76)]
生成76个未定义的数组

console.log(
[…新阵列(76)]

)
非常相似的东西只有当两个对象是同一个对象时,它们才相等。因为在您的情况下,
otherArray
myArray
不是同一个数组,所以它们不能相等。因为
null
不是javascript中未定义的值:
undefined
是。第一个填充了
未定义的
。如果我创建一个数组[undefined,undefined,undefined],
obj1==obj2
将始终是
false
[1]==[1];//false
链接到一个关于稀疏数组的资源,我想这将是一个完整的答案:)(关于数组迭代方法)它不仅仅是项目没有定义,索引也没有初始化;“新建数组(3);将创建一个包含三个未定义元素的数组”不完全正确。它创建空数组,没有任何值,甚至没有定义(所谓的“孔”)。它只是读取缺少的索引,返回
未定义的
@dfsq谢谢您的评论。我更新了我的答案。我不知道这个。@Christos它既没有索引也没有值,只有洞。这就像是分配的空间。一般来说,
新数组(数字)
没有什么有用的应用。我不明白你为什么要写这么复杂的函数。我测试了这个
函数createArray2(len,itm){var arr=[];而(len>0){arr.push(itm);len--;}return arr;}
我使用Chrome中的console.time和
createArray(10000,null)
createArray(1000000,null)的结果运行了测试
在1000 forloop中是:143.964ms/98.495ms和20114.130ms/16686.080ms我的函数总是越快。。。我错过了什么吗?这应该是今年的公认答案,我的朋友!您应该使用此方法。但请注意,IE中不支持“填充”