Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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中创建数组实例时总是需要使用new吗?_Javascript_Arrays - Fatal编程技术网

在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