在JavaScript中创建数组实例时总是需要使用new吗?
可能重复:在JavaScript中创建数组实例时总是需要使用new吗?,javascript,arrays,Javascript,Arrays,可能重复: 是否正确使用[]定义变量后不使用新数组 第一行创建一个空数组 第二个创建了一个包含5个元素的数组,所有元素的值均为undefined 两者都使用没有任何意义。使用哪一种取决于您试图做什么,但第二种形式在实践中并不常见。很可能第一个就是您所需要的。您正在将v的值从零长度数组重新分配到长度为5的数组。这使得=[]部件冗余 编辑: 这里的主要区别是数组构造函数的原型可以修改,因此最终得到的结果不一定与标准问题javascript数组完全相同 当您使用[]赋值时,将使用内部构造函数,这意味
是否正确使用[]定义变量后不使用新数组
第一行创建一个空数组 第二个创建了一个包含5个元素的数组,所有元素的值均为
undefined
两者都使用没有任何意义。使用哪一种取决于您试图做什么,但第二种形式在实践中并不常见。很可能第一个就是您所需要的。您正在将v的值从零长度数组重新分配到长度为5的数组。这使得
=[]
部件冗余
编辑:
这里的主要区别是数组构造函数的原型可以修改,因此最终得到的结果不一定与标准问题javascript数组完全相同
当您使用[]赋值时,将使用内部构造函数,这意味着数组原型篡改不会影响新对象。例如,我可以设置
Array.prototype.join=function(){alert(“duh”);}
,当您尝试调用join方法时,使用new Array(…)
构建的所有数组都将发出“duh”警报。使用[]
分配的数组不受此影响。不,这是不必要的,因为两者都做相同的事情。基本上你应该做的就是:
var v=[]; or var v=[value1, value2 ...];
定义数组的第二个版本存在以下问题:
数组(4)
==>创建一个空的4元素数组
数组(4,5)
==>创建一个包含2个元素(4和5)的数组
所以如果你想创建一个1元素的数组,它会在你的脸上爆炸。因此,建议使用第一个版本。与大多数语言不同,JavaScript为您提供了在需要时自我扩展的数组。但这并不意味着它没有成本 如果您有一个长度为N的数组,并将某个元素放在索引M>=N处,它必须创建一个长度为M-1的新数组,将N中的所有内容复制到该数组中,然后添加元素,这相当慢。 <强> >注意JavaScript具有非常不同的实现,有些人认为数组是具有特殊长度属性的普通对象。< /强> 为了避免这种情况,当您知道数组的大小而不知道它将包含什么时,您可以使用
newarray(size)
。如果您知道它将包含什么,最好使用literal符号[item1,item2]
。如果你真的不知道,就把[]
放进去
添加了简单的答案是,几乎没有什么好的理由在声明中使用
数组
关键字,无论是:
var a = Array(n)
或
只需使用:
var a = [];
相反
请参见没有必要将
new
与Array一起使用,我认为您可以创建Array,而无需使用new
操作符您正在创建两个Array
对象并丢弃一个,因此您所做的操作没有必要
声明变量并创建数组:
var v;
v = new Array(5);
或者作为一个单独的声明:
var v = new Array(5);
创建数组的首选方法是,当您要指定大小时,使用新建数组
,当您要从项创建数组时,使用数组文字:
var a1 = new Array(42); // creates an array with 42 undefined items
var a2 = [1, 2, 3]; // creates an array with the 3 items
对于零大小的阵列,您可以使用:
var a1 = new Array(); // creates an empty array
var a2 = []; // creates an empty array
数组
构造函数也可以获取项目列表,但应避免使用,因为如果有一个项目且该项目为数字,则其行为不同:
var a1 = new Array(100, 101, 102); // creates an array with three items
var a2 = new Array(100, 101); // creates an array with two items
var a3 = new Array(100); // creates an array with 100 undefined items
这只是一个例子;在我的代码中,重新分配是在后面完成的。第二行不会更新第一行创建的数组,而是生成一个与第一行创建的数组无关的新数组。(如果您在两行上都使用了
[]
,或者在两行上都使用了Array()
(有或没有new
),这也是正确的。)但是从问题的措辞来看,您似乎认为变量最初是否引用了使用数组文字定义的数组很重要-你的意思是什么?使用数组构造函数只有一个原因,那就是用一堆未定义的元素初始化数组,我从来没有这样做过,所以我一直远离那个令人困惑的构造函数,字面意义更好。如果您真的想将它初始化为一组未定义的s,我将使用var a=[];a、 长度=100代码>我认为这是非常清楚的事实上还有另一个原因(除了如果你把它作为一个参数传递给一个函数,你这样做并不方便之外):懒惰<代码>新数组(10).map(函数(){return1;})
是一个数组,包含10次未定义
Array.apply(null,新数组(10)).map(函数(){return1;})代码>给出一个包含10个1的数组。它的效率不高,不好等,但它的写作速度快,它的工作。所以,当你只想用一个填充了某种数据的数组来测试某些东西时,你可以使用它,你不知道你说的是真的。JS中的数组扩展了对象,所以它们很可能不是连续的,它们只是映射,由整数设置键,用一些代码来查找最大的现有索引,从而获得长度。将数组实现为哈希表是荒谬的。如果是的话,你也会在流行音乐推送和取消推送上有同样的表演。以更数学的方式,$a\意味着B$。这里有一个$\neg B$的证明,您可以做同样的事情,但这并不意味着它是以同样的方式实现的。JS允许你做一些愚蠢的事情,但不会优化它们。但是解释器会优化经常使用的东西,例如数组中的整数键…“它们很可能不是连续的”。。。“更有可能”是认真的吗?这是“更有可能的”,所以你甚至不检查就进行了否决表决?在IE7中,它们不是连续的,它们只是散列映射,即改进了IE8 My中对数组的处理
var a1 = new Array(); // creates an empty array
var a2 = []; // creates an empty array
var a1 = new Array(100, 101, 102); // creates an array with three items
var a2 = new Array(100, 101); // creates an array with two items
var a3 = new Array(100); // creates an array with 100 undefined items