Javascript-使用空值初始化数组
在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)将创建
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中不支持“填充”