176

当我需要声明一个新数组时,我使用这个符号

var arr = new Array();

但是当在线测试时,例如在jsbin上,一个警告信号告诉我“使用数组文字符号 []”。

我没有找到避免使用构造函数的理由。在某种程度上比使用效率低[]吗?或者这是不好的做法?

是否有充分的理由使用var arr = [];而不是var arr = new Array();

4

9 回答 9

260

大多数情况下,人们使用Douglas Crockford 是var a = []因为Douglas Crockford 这么说的。

他的原因包括以下非直觉和不一致的行为new Array()

var a = new Array(5);     // an array pre-sized to 5 elements long
var b = new Array(5, 10); // an array with two elements in it

请注意,无法new Array()创建仅包含一个预先指定的数字元素的数组!

使用[]实际上更有效,也更安全!可以覆盖Array构造函数并让它做一些奇怪的事情,但你不能覆盖[].

就个人而言,我总是使用[]语法,同样总是使用{}语法代替new Object().

于 2012-07-16T08:25:09.383 回答
48

一个显着的区别是它总是[]会实例化一个新的 Array,而可能会被劫持以创建一个不同的对象new Array

(function () {
    "use strict";
    var foo,
        bar;
    //don't do this, it's a bad idea
    function Array() {
        alert('foo');
    }
    foo = new Array();
    bar = [];
}());​

在我的示例代码中,我将Array函数从文档范围的其余部分隐藏起来,但是如果您遇到此类问题,代码将不会被留在一个很好的闭包中,并且会可能很难找到。

免责声明Array:劫持构造函数不是一个好主意。

于 2012-07-16T14:10:23.203 回答
26

为了可维护性,使用[]

数组字面量更具可预测性,因为大多数开发人员都使用它。大多数数组使用都将使用文字,并且让您的代码与其他开发人员使用的代码相匹配是有价值的。

对于空数组,使用[]

var ns = [];
var names = [ 'john', 'brian' ];

如此处所示,使用文字表示空元素和几个已知元素比 Array 构造函数更胖。

对于已知大小的数组,使用new Array(size)

如果大小已知,则使用 Array 构造函数可显着提高性能。但是,这也意味着您必须处理一个已经有“未定义”填充其所有值的数组。

如此处所示

// fill an array with 100 numbers
var ns = new Array( 100 );
for ( var i = 0; i < 100; i++ ) {
    ns[i] = i;
}

这也适用于非常小的数组

于 2012-07-17T05:18:58.920 回答
12

不,实际上没有理由对空数组使用一种表示法而不是另一种表示法。

x = [];但是,大多数浏览器使用比调用Constructor显示出更好的性能。

如果您需要创建一个具有特定大小的数组,您需要使用x = new Array(10);例如,这将创建一个具有 10undefined个插槽的数组。

于 2012-07-16T08:25:16.067 回答
7
  • var arr=[] 使用数组/对象字面量
  • var arr = new Array() 使用数组/对象构造函数

定义数组或对象的最快方式是字面量方式,因为您不需要调用构造函数

var arr1 = new Array(1, 2, 3, 4);
var arr2 = [1, 2, 3, 4];

alert(arr1[0]); // 1
alert(arr2[0]); // 1

var arr3 = new Array(200);
var arr4 = [200];

alert(arr3[0]); // 'undefined'
alert(arr4[0]); // 200
于 2012-07-16T11:04:11.907 回答
6

两者都是正确的。但是大部分人用var a = []

在 JavaScript 中声明数组的三种方法。

方法1:我们可以显式地声明一个数组,使用JavaScript“new”关键字来实例化内存中的数组(即创建它,并使其可用)。

// Declare an array (using the array constructor)
var arlene1 = new Array();
var arlene2 = new Array("First element", "Second", "Last");

方法2:我们使用另一种方法来声明数组。

// Declare an array (using literal notation)
var arlene1 = [];
var arlene2 = ["First element", "Second", "Last"];

方法 3:JavaScript 还允许您通过调用特定方法间接创建数组。

// Create an array from a method's return value
var carter = "I-learn-JavaScript";
var arlene3 = carter.split("-");
于 2012-07-16T08:35:36.950 回答
4

构造函数可以作为参数有一个限制。

在我遇到的大多数系统上,限制是 2^16(2 个字节):

var myFreshArr = new Array(0,1,2,3 ..... 65536);

这将导致错误(参数过多....)

使用文字 [] 时,您不会遇到此类问题。

如果你不关心这么大的数组,我想你可以使用你喜欢的任何东西。

于 2012-07-16T08:25:04.657 回答
4
var array = [ 1, 2, 3, 4];

是糖

var array = new Array(1, 2, 3, 4);

是盐

于 2012-07-16T13:58:32.687 回答
3

就是因为new Array()模棱两可。这些是正确的构造函数:

// Using brackets
[element0, element1, ..., elementN]

// Using new AND a list of elements
new Array(element0, element1, ..., elementN)

// Using new AND an integer specifying the array length
new Array(arrayLength)
于 2012-07-16T08:25:11.200 回答