在 Javascript 中声明数组时要遵循的最佳实践是什么?

IT技术 javascript
2021-03-06 23:31:28

当我需要声明一个新数组时,我使用这种表示法

var arr = new Array();

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

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

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

6个回答

大多数情况下,人们使用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().

“你不能覆盖 [] 的行为。” 你确定吗?我认为您可以覆盖 Array 构造函数来影响 [],并覆盖 Object 构造函数来影响 {},至少在某些实现上是这样。
2021-05-08 23:31:28
奖励:数组文字比使用Array构造函数创建新数组快得多jsperf.com/new-array
2021-05-08 23:31:28
@Random832 可能在较旧的浏览器中,但不是在 ES5 兼容的实现中,其中规范说[]调用内部构造函数,而不是Array.constructor当时碰巧具有的任何值
2021-05-12 23:31:28
@MathiasBynens 只是有时。
2021-05-13 23:31:28
Ew @ [] 由于内部构造函数的原因而工作方式不同。不一致会导致更多的混乱而不是它所节省的。编辑:啊,安全问题。我知道了。
2021-05-15 23:31:28

一个显著不同的是,[]始终实例化一个新的磁盘阵列,而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构造函数不是一个好主意

IIRC,在旧浏览器中覆盖 Array 构造函数也会导致文字被错误解释。不久前有一个 GMail CSRF漏洞,涉及覆盖数组构造函数,新浏览器出于这个确切原因忽略了文字的重载。
2021-04-24 23:31:28
反免责声明:然而,多年来增强 Array 构造函数非常有帮助和有用。
2021-04-28 23:31:28

为了可维护性,使用 []

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

对于空数组,请使用 []

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;
}

这也适用于非常小的数组

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

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

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

jAndy,你为什么要在 JavaScript 中创建一个带有“10 个空槽”的数组?实际上,您可以使用以下命令执行完全相同的操作: var arr = []; arr[9] = "欧米茄"; 1. JS 中的数组是完全动态的,你可以引用任何你想要的索引,它只是“未定义”。这就像您要说的一样: var arr = new Array(10); arr[23]; 2. 数组的长度将被设置为其中包含任何内容的最大值,无论中间有多少未定义的插槽。或者你可以自己设置。[] 可能无法治愈癌症,但效果会好一些。
2021-04-30 23:31:28
@Alnitak:你已经提到过,不是很直观和简洁。
2021-05-09 23:31:28
我整理了一个 jsperf 来比较性能:jsperf.com/array-constructor-versus-literal至少对我在 Ubuntu 上的 Chrome 20 上来说,文字的速度是构造函数的两倍。
2021-05-10 23:31:28
2021-05-10 23:31:28
  • 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
作为参考,在幕后,var arr = [];逻辑上也使用构造函数。总是内置的数组构造函数,而不是当前名称为的任何函数Array
2021-04-15 23:31:28