代码之家  ›  专栏  ›  技术社区  ›  OpenSource

使用javascript新数组(n)声明

  •  46
  • OpenSource  · 技术社区  · 17 年前

    基本JavaScript问题:因为对于Java的情况,数组没有硬限制(即 IndexOutOfBoundsException )在指定length属性时,声明的用途是什么?

    var a = new Array(10);
    

    我知道它预先定义了长度,并将“未定义”放入那些空白点。这就足够了吗?

    8 回复  |  直到 8 年前
        1
  •  39
  •   coderjoe    17 年前

    声明数组大小有许多可感知的好处,但我认为大多数可感知的好处只是被传递。

    性能更好!速度快!

    就我所知,预分配和动态分配的区别是可以忽略的。

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

    来自第15.4.2.2节 ECMA-262 :

    如果论点 伦恩 是一个数字和touint32( 伦恩 等于 伦恩 然后 长度 新构造对象的属性设置为ToInt32( 伦恩 )如果论点 伦恩 是一个数字和touint32( 伦恩 )不等于 伦恩 A 测距误差 引发异常。

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

    它使代码更易于理解!

    就个人而言,我不同意。

    考虑一下您过去编写的javascript,以及将来可能必须编写的代码。我想不出一个时间需要在其中一个数组上指定静态限制。我还认为限制javascript中数组的潜在问题远远超过了让人们知道您在想什么而不进行实际检查所带来的好处。让我们权衡一下利弊…

    赞成的意见:

    1. 他们会更容易理解您想要代码做什么。
    2. 他们将能够找到由你以后的假设引起的错误(舌头紧紧地贴在脸颊上)

    欺骗:

    1. 快速浏览可以很容易地将“新阵列(10)”与“新阵列(10)”混淆,后者执行完全不同的操作!
    2. 您对没有正常长度限制的代码施加任意限制,这会导致您编写许多锅炉板代码来检查和维护限制。
    3. 您对代码施加了一个任意的限制,这个限制可能已经被泛化为使用任何长度的值。
    4. 您假设人们将如何阅读您的代码,同时假设备选方案不会那么混乱。

    你也可以写:

    //I assume this array will always be length 10
    var arr = new Array();
    

    在上面的例子中,注释甚至可能更可取。明确的意向声明可以避免任何不用于将构造函数用作意向声明的混淆。

    那么好吧…为什么你认为它就在那里?

    方便。当他们写规范的时候,我想他们意识到了两件事。

    1. 类似语言的开发人员将习惯这种分配。
    2. ECMAScript的实现可能会使用它来提高性能。

    所以他们把它放进去了。 规范只定义参数的使用,而不定义如何实现它。

        2
  •  23
  •   Gabriel Garcia    14 年前

    V8 JavaScript引擎的性能。

    通过做:

    var arr = []; arr.length = 1000;
    

    V8将预先分配阵列所需的内存,并维护/设置阵列的 Hidden Class 紧凑型开关磁阻电机 (小整数,31位无符号) 数组 . 然而,当所需的长度太大时,这是不正确的,这导致HC被设置为 稀疏阵列 (即地图)。

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

    我已经包含了一个没有数组长度定义的额外测试用例,这样您就可以知道实际的性能差异。

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

        3
  •  6
  •   Max Schmeling    17 年前

    我不确定,但我敢打赌它在较低的级别上分配内存是不同的。如果您知道要创建10000个项目,只需保留足够的空间,而不是动态地让它在后台随时调整大小。

        4
  •  5
  •   scvalex    17 年前

    清晰。

    在编写代码时,您的目标是 这对于计算机来说是如此的理解你,但是对于下一个阅读你的代码来理解你的程序员来说。

    var xs = new Array(10);
    

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

    var xs = [];
    

    上面没有透露任何信息;没有额外的信息。

    干杯。

        5
  •  2
  •   FesterCluck    11 年前

    我创造了 this JSPerf 它演示了这个问题,包括它的各种版本。我发现的论点如下:

    1. 使用new array()可能会发生意外行为,可以重写
    2. setting.length在某些浏览器中不会实际增加数组大小
    3. 性能冲击并不真正存在。

    我认为这些测试应该停止这些论点,但应该注意的是,不同的浏览器对这个问题的处理方式非常不同。Firefox似乎在优化和计算阵列的大小 是的,而chrome会按预期分配内存。而且,和往常一样,Internet Explorer在这项任务上也很差劲。

        6
  •  1
  •   bpreece    8 年前

    假设需要将某个长度的数组初始化为某个值。这不起作用:

    scores = [].fill(0.0, 0, studentCount);
    

    它只会给您一个空数组,因为fill()永远不会将数组扩展到其原始长度之外。

    这将起作用:

    scores = new Array(studentCount).fill(0.0, 0, studentCount);
    

    它将为您提供一个studentCount值数组,这些值初始化为零。

        7
  •  0
  •   Vish    10 年前

    保持数组大小并不困难。请看下面的示例:

    function updateArray(){
        var a = [1,2,3,4,5,6,7,8,9,10]; //original array object
        var b = [11, 12, 13];  //New array object to be pushed
        a.splice(a.length-b.length, a.length);
        a.unshift.apply(a, b);
        return a;
    }
    

    a.unshift.apply(arg1, arg2) 将新元件推到顶部,然后 a.push.apply(arg1, arg2) 在底部。

        8
  •  -1
  •   bharal OpherV    13 年前

    嗯,就我个人而言,我想排队。我希望队列长度为10。

    最简单的方法是使用 push 数组方法,用于将项放入队列的末尾,以及 shift() 方法将它们从数组前面移除。

    问题是,如果我想为我的队列创建一个简单的“添加”方法,我会这样写:

    function addItemToArray(item, array){
        array.shift();
        array.push(item);
        return array;
    }
    

    那就没什么好事了。更好的方法(实际上,有效的方法)是这样声明我的数组:

    var maxSizeIsTen = new Array(10);
    

    然后到处使用。另外,请注意描述数组的“好”方法——没有任何人读取的注释,任何使用此代码的人都将按短顺序计算出该数组的最大大小。

    哎呀!