这三种创建数组的方式有什么区别吗?

3
这三种创建数组的方式有何区别?如果没有区别,那么前两种方式存在的意义是什么,为什么它们需要更多的代码?
1:
var myCars=new Array(); 
myCars[0]="Saab";       
myCars[1]="Volvo";
myCars[2]="BMW";

2:

var myCars=new Array("Saab","Volvo","BMW");

3:

var myCars=["Saab","Volvo","BMW"];

5
它们都有相同的目的。[]new Array()一样,用于创建数组。在同一行中填充值与为每个值单独使用一行没有区别,除了可维护性。如果你需要在开头添加一个新值,那么你必须重新编号其余的值。我不确定如何回答您问题的第二部分。 - Kevin B
前两种方式之所以存在,是因为它们是可能的(#1 是作为副作用),尽管这可能是不幸的。 - Ry-
2
@KevinB 它们的创建方式并不相同。请参考 https://dev59.com/9nA75IYBdhLWcg3wDUco 和 https://dev59.com/BnNA5IYBdhLWcg3wgeOk - Oleg
字面量数组表示法(您的数字3,或[])是最常接受的表示法,因为jslint首选它,而jslint是最受欢迎的JavaScript代码质量检查器。如果带宽是一个问题,它也是最简单的。 - howderek
你也可以使用 var a=Array(n) 创建长度为 n 的数组,无需使用 'new'。 如果你正在构建一个复杂的数组并运行迭代器(如 map 或 forEach),这非常方便。 - kennebec
3个回答

6
使用[]比使用new Array()更安全可靠。事实上,推荐使用前者。这是因为Array的值可以被覆盖。此外,与new Array()相比,[]速度更快
请查看以下相关问题: 一个相关的链接: 为了澄清“覆盖”的含义,您可以这样做:
function Array() {
    alert("I am not really an array! BWAHAHAHAHAHA!");
}

现在,当你执行new Array();时,你会得到一个警告,这显然不是你想要的。

简而言之,使用new Array()并没有迫切的需要,相比使用字面量[],它并没有更多的优势。


我不会称其为“安全的”。也许更好的词是“可靠的”? - Oleg
@Oleg,实际上由于Array可能被覆盖以执行恶意操作,因此它确实更安全。 :) 但是,确实存在可靠性问题。 - Vivin Paliath
1
+1 如果正确使用“BWAHAHAHAHAHA!” - Blazemonger

1

区别:

在第一种方法中,数组声明和数组初始化是分开进行的。在第二种和第三种方法中,数组声明和数组初始化在单个语句中完成。第三种方法只是第二种方法的简写。

需要:

情况1:假设你今天没有车,但将来打算买一辆。因此,

var myCars = new Array();

情况2:假设您今天拥有2辆车。但是在未来,您可能会买/卖一辆或多辆汽车。

var myCars = new Array("BMW", "Porsche");

总之,如果你事先知道数据,就使用第二或第三种方法;但如果你不知道数据,就使用第一种方法。

这并没有真正解释 [] 与使用 new Array() 之间的区别。 - Vivin Paliath
@VivinPaliath - 我同意。但问题的第一部分是关于创建数组的3种方式/语法的区别,而不是哪种更好?我对JS内部的知识不是很了解... - Girish

0

对于数组而言,这两种方法之间没有太大的区别,除了可读性和纯符号表示法略微具有一定的性能优势。

然而,通常建议在可能的情况下使用纯符号表示法来代替构造函数,特别是在JavaScript中。因为虽然 'new Array()' 和 'new Object()' 与 []{} 的结果相同,但是对于基本类型使用构造函数实际上可能会导致问题。

例如,new String() 将创建一个字符串对象而不是一个基本字符串。这会导致无法使用 === 和其他字符串比较操作。

例如:

 alert(new String("") === new String("")); //false alert ("" === "")
 //true

因此,虽然在这种特定情况下没有区别,但通常最好养成使用基本符号而不是使用内置类型的构造函数的习惯。

澄清

当我说没有区别时,我的意思是在一般情况下,这些符号将产生相同的结果。Vivin的观点非常好,也是避免使用此符号的另一个原因。


-1:除了可读性之外,还存在重大差异!Array可以被覆盖,而[]则不能。 - Vivin Paliath
有一个区别,在数组构造和功能上。例如,new Array(10)[10]不同。 - Oleg
@Oleg 是的,但那不是他举的例子之一。 - Ben McCormick
@VivinPaliath 确实,第一种符号表示法提供了更多的机会犯错误,但在大多数情况下这不会有显著的区别。我也赞同了你的答案,我觉得它很有趣,但在一般情况下,这些符号表示法将产生相同的值。我正在研究为什么新的内置类型符号表示法可能会在一般情况下引起问题。我认为我们的答案都提供了有用但是独立的贡献。 - Ben McCormick
@ben336 我没有给你的回答点踩 :). 但是我认为 new Array() 引起的问题比它所值得的要多得多,因为它并没有提供比 [] 更多的东西。事实上,它有可能引起更多的问题。这就是为什么我非常喜欢 [] 而不是 new Array(),因为在我看来,看到 [] 就足以让我意识到它是一个数组了。 - Vivin Paliath
@VivinPaliath 我们并不持不同意见。你的理由很好,你值得得到赞同。我只是决定集中讨论一些其他原因,说明为什么那种符号通常会有害,而不是再次重复你的理由。 - Ben McCormick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接