var x = new Array()有什么问题;

Chr*_*s S 38 javascript jslint

在JSLint中,它警告说

var x = new Array();
Run Code Online (Sandbox Code Playgroud)

(这不是一个真正的变量名称)应该是

var result = [];
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*Lew 70

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

Array = function() { };

var x = new Array();
// x is now an Object instead of an Array.
Run Code Online (Sandbox Code Playgroud)

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

  • []将始终是一个Array对象.当我说"覆盖"时,我并不是要暗示实际的Array类被覆盖."Array"实际上是一个全局变量,因此可以赋予一个新值 - 所以我重新分配变量"Array"引用的内容.用于引用的Array仍然完好无损.(这也是为什么我开玩笑地重写'undefined'和'NaN'的原因 - 它们也是可以用同样的扭曲方式操纵的全局变量.) (4认同)
  • 不仅如此,Array()构造函数还有一些"奇怪"行为,具体取决于传递的参数数量.这通常是古怪的,最好避免. (2认同)

Sho*_*og9 26

克罗克福德不喜欢new.因此,JSLint希望您尽可能避免使用它.并且可以在不使用new....的情况下创建新的数组对象.

  • 但是,无需在声明时将数组初始化为特定大小.JavaScript数组不像C数组.它们是对象,而不是静态大小的,连续的内存块.因此,您可以根据需要将值附加到数组中.实际上,在声明时初始化并稍后填充可能会慢**因为在声明时,所有n个键都必须进行哈希处理,然后因为它们被赋值,所以它们可能必须重新哈希. (7认同)
  • 但是,当您尝试使用n值启动数组时,jslint会中断.例如:var x = new Array(20); 这种创建方法并不经常使用,但它有它的情况,并且比使用循环来创建和填充数组要快得多. (3认同)
  • 你可以将第n个元素设置为undefined,它或多或少地做同样的事情 (3认同)

Par*_*ris 7

根据您使用的浏览器或环境,您似乎可以获得不同的性能以及用于何种目的:

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

http://jsperf.com/new-array-vs-literal/7(新阵列(500000)vs [].length(500000))新阵列在chrome v21中的速度更快,这个测试看起来大约是7%或30 %)取决于你做什么.


ken*_*bec 5

这两种形式都没有错,但你通常会在任何可能的地方看到文字 -

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