使用JavaScript新的Array(n)声明

Ope*_*rce 48 javascript

基本的JavaScript问题:由于Java的情况没有硬限制(即IndexOutOfBoundsException),我们指定长度属性的声明的用途是什么?

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

我知道它预定了长度并将"未定义"放入那些空白点.这个理由足够了吗?

cod*_*joe 41

声明阵列大小有许多明显的好处,但我认为大多数感知到的好处只是传递FUD.

性能更好!/它更快!

据我所知,预分配和动态分配之间的区别可以忽略不计.

更有趣的是,规范没有声明数组应该设置为预先分配的长度!

从第15.4.2.2节ECMA-262:

如果参数len是Number且ToUint32(len)等于len,则新构造的对象的length属性设置为ToUint32(len).如果参数len是Number且ToUint32(len)不等于len,则抛出RangeError异常.

这里有一个不科学的有趣测试案例:http://jsbin.com/izini

它使代码更容易理解!

就个人而言,我不同意.

考虑一下您过去编写的javascript,并考虑将来可能需要编写的代码.我无法想到我需要在其中一个数组上指定静态限制的时间.我还认为,在javascript中限制数组的潜在问题远远超过让人们知道你在想什么而没有实际检查所带来的好处.让权衡利弊......

优点:

  1. 他们将更容易理解您希望代码执行的操作.
  2. 他们将能够找到你后来的假设造成的错误(舌头紧紧地贴在脸上)

缺点:

  1. 快速浏览一下就很容易混淆"new Array(10)"和"new Array('10')"这些完全不同的东西!
  2. 您对代码施加了任意限制,没有正常的长度限制,导致您编写大量锅炉板代码以检查和维持限制.
  3. 您对代码施加了任意限制,这些限制可能已被推广为使用任何长度的值.
  4. 您假设人们将如何阅读您的代码,同时假设替代方案不那么混乱.

你也可以写:

//I assume this array will always be length 10
var arr = new Array();
Run Code Online (Sandbox Code Playgroud)

在上述情况下,评论可能更可取.明确的意图声明可以避免任何不习惯使用构造函数作为意图声明的混淆.

那好吧..为什么你认为它甚至在那里呢?

方便.当他们编写规范时,我认为他们实现了两件事.

  1. 这种类型的任务将是来自类似语言的开发人员将被用于.
  2. ECMAScript的实现可能会使用它来提高性能.

所以他们把它放在那里.规范仅定义参数的使用,而不是如何实现.

  • 这个答案很古老而且完全错误。在 Node 中,我可以初始化一个数组 `const s = new Array(10000000)` 并执行 1000 万次插入,使用数组文字 `[]` 需要 23.6 秒,使用构造函数需要 5.5 秒。 (6认同)

Gab*_*cia 28

V8 JavaScript引擎的性能.

通过做:

var arr = []; arr.length = 1000;
Run Code Online (Sandbox Code Playgroud)

V8将为阵列预分配所需的内存,并维护/设置阵列Hidden Class紧凑型SMI(小型Int,31位无符号)阵列.然而,当期望长度太大时,这不是真的,这导致HC被设置为稀疏阵列(即,映射).

请在Chrome上尝试以下链接:http://jsperf.com/0-fill-n-size-array

我已经包含了一个没有数组长度定义的额外测试用例,因此您可以了解实际的性能差异.

相关信息:http://www.youtube.com/watch?v = UJPdhx5zTaw


scv*_*lex 8

明晰.

在编写代码时,您的目标不是让计算机理解您,而是让下一个程序员读取您的代码以了解您.

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

上面的代码显示了你的意图:拥有一个10元素的数组.

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

上面没有任何结果; 没有额外的信息.

干杯.

  • var xs = []; 告诉您,将存储在此数组中的项目数量不固定.[例如,它可能取决于用户输入] (5认同)

Max*_*ing 6

我不确定,但我敢打赌,它会以较低的水平分配不同的内存.如果你知道你正在创建10,000个项目,那么只需保留那么多空间而不是动态地让它在后台一直调整大小.

  • @bharal:不,每个ms都会减少1000倍. (8认同)
  • 如果每一秒都计数,那么每个ms的数量都不会超过1000倍吗? (2认同)