【问题标题】:What's wrong with var x = new Array();var x = new Array(); 有什么问题?
【发布时间】:2010-10-27 11:25:03
【问题描述】:

在 JSLint 中,它会发出警告

var x = new Array();

(那不是真正的变量名)应该是

var result = [];

第一种语法有什么问题?该建议背后的原因是什么?

【问题讨论】:

  • 第一种语法没有问题。第二个更短。

标签: javascript jslint


【解决方案1】:

使用[] 比使用new Array() 更安全,因为您实际上可以在JavaScript 中覆盖Array 的值:

Array = function() { };

var x = new Array();
// x is now an Object instead of an Array.

换句话说,[] 是明确的。

【讨论】:

  • 好点!请注意,重写 Array 还会导致代码中出现严重问题,即尝试在类似数组的对象(例如参数)上使用 Array.prototype 方法......所以仍然是一个非常糟糕的主意。
  • 不仅如此,Array() 构造函数还有一些“奇怪”的行为,具体取决于您传递的参数数量。它通常很古怪,最好避免。
  • 不要误会我的意思,我肯定不是在推广压倒一切的 Array。 (好吧,除非您也覆盖 'undefined' 和 'NaN',否则不会,只是为了与任何敢于使用您的代码的人搞砸。)
  • 如果覆盖 Array,var x = []; 会发生什么?那不是一个 Array 对象吗?
  • [] 将始终是一个 Array 对象。当我说“覆盖”时,我并不是要暗示实际的 Array 类已被覆盖。 “Array”实际上是一个全局变量,因此可以分配一个新值 - 所以我正在重新分配变量“Array”引用的内容。用来引用的 Array 仍然完好无损。 (这也是我开玩笑说要覆盖 'undefined' 和 'NaN' 的原因——它们也是全局变量,可以以同样的方式进行操作。)
【解决方案2】:

Crockford doesn't like new。因此,尽可能JSLint expects you to avoid it。并且不使用new....也可以创建一个新的数组对象。

【讨论】:

  • 但是,当您尝试启动具有 n 个值的数组时,jslint 会中断。例如: var x = new Array(20);这种创建方法并不经常使用,但它有它的用例,并且比使用循环创建和填充数组要快得多。
  • 您可以将第 n 个元素设置为未定义,它或多或少做同样的事情
  • 不过,在声明时不需要将数组初始化为特定大小。 JavaScript 数组与 C 数组不同。它们是对象,而不是静态大小的连续内存块。因此,您可以根据需要将值附加到数组中。事实上,在声明时初始化并稍后填充可能会更慢,因为在声明时,必须对所有 n 键进行哈希处理,然后在为它们分配值时,可能必须对其进行重新哈希处理。跨度>
【解决方案3】:

根据浏览器或环境的不同,您似乎可以获得不同的性能:

http://jsperf.com/new-array-vs-literal/11 ( [1,.2] vs new Array(1,.2) ) 在这种情况下,文字要快得多。

http://jsperf.com/new-array-vs-literal/7 ( new Array(500000) vs [].length(500000) ) new Array 在 chrome v21 中速度更快,这个测试似乎快了 7% 或 30%),这取决于你做什么。

【讨论】:

    【解决方案4】:

    这两种形式都没有问题,但您通常会看到尽可能使用文字-

    var s='' 并不比 var s=new String()....正确。

    【讨论】:

      【解决方案5】:

      第一种语法本身没有问题。事实上,在w3schools 上,它列出了new Array() 作为创建数组的方式。问题是这是“老方法”。 “新方式”[] 更短,允许您初始化数组中的值,如["foo", "bar"]。大多数开发者更喜欢[] 而不是new Array() 的良好风格。

      【讨论】:

      • 可能是因为 w3 学校与 w3.org 没有关联,而且它们的代码通常很差或不准确。
      • @AndrewAustin 真的。尽管在互联网中,作为一般经验法则,您应该仔细检查来源,无论您从哪里获取信息。
      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 2019-03-12
      • 2022-01-15
      • 2023-03-27
      • 1970-01-01
      • 2019-09-11
      相关资源
      最近更新 更多