`
keshin
  • 浏览: 12351 次
  • 性别: Icon_minigender_1
  • 来自: SH.IT
社区版块
存档分类
最新评论

往一个数组中添加另外另外一个数组中的元素,两种方式比较(拼接和push)

阅读更多
jQuery里面有一段源码:
Array.prototype.push.apply(someArray, otherArray);
这个做法依赖两点:
1、apply方法的第二个参数是数组的情况下,这个数组参数会作为apply的方法的参数列表(arguments);
2、push方法接受可变参数列表:array.push(item1 [, item2 ... [, itemN]])
按照源码注释的说法,“super-fast way to populate an object with array-like properties”,正好最近自己在写一个jQuery插件时需要往一个数组中添加另外一个数组中的元素,我采用的方法是使用Array的concat方法拼合另外一个数组,再将生成的数组重新赋值给原先的数组变量:
someArray = someArray.concat(otherArray)
而我之前一直纠结于此方法会产生一个额外的数组变量,而且第一个数组长度越大性能开销就越大(需要复制引用),看到jQuery中的这段源码便很是欢喜,打算换掉之前插件中的这种处理方式。
不过为保险起见,我还是先做了两个实验
第一个实验:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <script type="text/javascript">
      var rightArray = [];
      window.onload = function() {
        for (var i = 0; i < 1000000; i++) {
          rightArray.push(i);
        }
      };
      function doPush() {
        var array = [];
        var before = new Date().getTime();
        Array.prototype.push.apply(array, rightArray)
        var after = new Date().getTime();
        document.getElementById("result").innerHTML = (after - before);
      }
      function doConcat() {
        var array = [];
        var before = new Date().getTime();
        array = array.concat(rightArray);
        var after = new Date().getTime();
        document.getElementById("result").innerHTML = (after - before);
      }
    </script>
  </head>
  <body>
      <span id="result"></span>
      <input type="button" value="pushAll" onclick="doPush();" />
      <input type="button" value="concat" onclick="doConcat();" />
  </body>
</html>
实验结果:
1、在ff3.0.9下,concat的平均耗时在130毫秒左右,applypush的方式平均耗时在70毫秒左右
2、在ie8下,concat的平均耗时在270毫秒左右,而applypush的方式平均耗时居然是两秒…………囧冏
第二个实验针对在第一个数组长度不同的情况下两种方式的差异,代码就不贴了,直接说结论,在ff下,concat方式的耗时确实会随着第一个数组长度的增加而增加,而push的方式则影响不大,ie下我已经没勇气试了。

结论
应该说jQuery的这种方式在ff下确实可以说是super-fast,但是在ie8下的测试数据让我实在无语,我不知道是不是我实验方式有问题……
看来我还是继续在我的代码中使用concat吧,而且我写的那个插件不可能出现这么大数据量的场景,这点性能差异就忽略吧。
分享到:
评论
2 楼 keshin 2009-04-23  
caii 写道
super-fast way to populate an object with array-like properties
让一个对象有“类数组”属性 超快的方法。

帮你测了下,在GOOGLE浏览器中,concat也不比[].push 慢。

呵呵,多谢了,手头没有chrome
1 楼 caii 2009-04-23  
super-fast way to populate an object with array-like properties
让一个对象有“类数组”属性 超快的方法。

帮你测了下,在GOOGLE浏览器中,concat也不比[].push 慢。

相关推荐

    JavaScript中数组的22种方法必学(推荐)

    - `push()`:在数组末尾添加一个或多个元素,并返回新的长度。 - `pop()`:移除并返回数组的最后一个元素。 - `shift()`:移除并返回数组的第一个元素。 - `unshift()`:在数组开头添加一个或多个元素,并返回新...

    JavaScript中数组的22种方法必学(推举)_.docx

    5. `push()`:在数组末尾添加一个或多个元素,并返回新长度。 6. `pop()`:删除并返回数组的最后一个元素。 7. `shift()`:删除并返回数组的第一个元素。 8. `unshift()`:在数组开头添加一个或多个元素,并返回新...

    JS数组方法汇总

    - `map()` 创建一个新的数组,新数组中的元素是原数组元素经过函数处理后的结果。 - `for...of` 循环遍历数组的可迭代属性,如 `for (let item of arr) {...}` 4. **添加元素** - `push()` 在数组末尾添加元素,...

    js 数组的变化

    例如,`myArray.push(value)` 可以向数组末尾添加元素,`myArray.pop()` 则可以移除最后一个元素。 2. **数组和对象的关系**:在JavaScript中,数组本质上是特殊的对象,因为它们的键是数字(即索引),而值可以是...

    js 数组详细操作方法及解析合集

    3. `push()`方法用于向数组的末尾添加一个或多个元素,并返回新的数组长度。 ```javascript var a = [1, 2, 3]; var newItem = a.push('末尾'); // a变为[1, 2, 3, '末尾'], newItem为4 ``` 4. `unshift()`方法用于...

    探讨js字符串数组拼接的性能问题

    例如,我们可以预先创建一个空数组`buffer`,然后通过索引直接添加元素(如`buffer[i++] = "string"`)而不是使用`push`方法,因为直接通过索引赋值通常更快。最后,通过`join`方法将数组中的所有元素合并成一个字符...

    javascript入门笔记

    Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 ... 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话...

    浅谈JavaScript Array对象

    3. push()方法:在数组的尾部添加一个或多个元素,并返回新的长度。 4. pop()方法:移除数组的最后一个元素,并返回被移除的元素。 不修改原数组的方法包括: 1. concat()方法:用于合并两个或多个数组。此方法...

    js两种拼接字符串的简单方法(必看).docx

    ### JavaScript中的两种字符串拼接方法 在Web开发中,JavaScript是一种非常重要的客户端脚本语言,被广泛用于网页的动态效果实现、数据处理等场景。本文将详细介绍JavaScript中两种常见的字符串拼接方法及其应用...

    JavaScript实现在数组中查找不同顺序排列的字符串

    本篇文章将介绍两种方法来实现这个功能,具体针对以下需求:从给定的字符串数组中找出所有字符顺序不同的字符串组合。 首先,我们来看第一种方法: ```javascript var stringClassify = function(arr) { var ...

    php 数组动态添加实现代码(最土团购系统的价格排序)

    这里用到了array_push()函数,它可以将一个或多个元素添加到数组的末尾。值得注意的是,此处的数组$oc是一个包含字符串条件的数组,最终可以被用于构建动态SQL查询语句,对数据库进行条件筛选。 通过以上步骤,我们...

    数据结构实验报告(链表,栈,串,数组,邻接表,邻接矩阵,查找,归并排序和快速排序的实验代码)

    邻接表和邻接矩阵是图数据结构的两种常见表示方式。邻接表适合表示稀疏图,即边的数量远小于顶点数量的平方;而邻接矩阵则适用于表示稠密图,即边的数量接近顶点数量的平方。这两种数据结构在图遍历、最短路径计算等...

    数据结构代码例题 堆栈 树 连表 字符串 基本操作程序员笔试必备的东西

    堆栈的基本操作包括压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek)和检查栈是否为空(IsEmpty)。C/C++中可以使用数组或链表来实现堆栈。 接下来是树(Tree)。树是一种非线性数据结构,由节点和边构成,每个...

    JavaScript数组常用方法

    它具有丰富的内置对象和方法,其中数组是一个重要的数据结构,用于存储和操作有序的元素集合。JavaScript中的数组操作方法非常丰富,包括但不限于判断数组、数组元素的增加与删除、数组排序、数组元素的拼接等。 ...

    html数组字符串拼接的最快方法

    在浏览器性能测试中,使用长度为130的数组和不同长度的元素进行1000次迭代,结果显示,直接使用`join()`的方法通常比其他两种方法更快。这是因为`join()`是JavaScript引擎内置的方法,其内部优化可能比手动操作更...

    JavaScript数组去重的3种方法和代码实例

    这种方法是通过创建一个空对象`obj`作为哈希表,遍历数组,将元素作为键存入对象。由于JavaScript对象的键是唯一的,因此重复的元素将被忽略。这种方法简单快捷,但在某些情况下可能不准确,例如`1`和`'1'`会被认为...

    js数组去重的hash方法

    在`unique`方法内部,创建一个空对象`hash`作为哈希表,同时初始化一个空数组`result`用于存放不重复的元素。遍历数组中的每个元素,如果`hash`中不存在该元素作为键,则将其添加到`hash`中并将其推入`result`数组。...

    深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)

    数组的拼接可以通过concat()方法实现,该方法不会改变现有的数组,而是返回一个新数组,新数组的内容是原数组和参数中数组的元素的组合。slice()方法则用于提取原数组的一部分,返回一个新的数组对象。位置方法index...

    javascript中字符串拼接详解

    模拟StringBuffer类的方式之一是通过创建一个数组,然后利用数组的push()方法来添加字符串片段,最后使用join()方法将数组中的所有字符串片段连接成一个完整的字符串。这样做的优势在于,在数组中追加字符串片段的...

Global site tag (gtag.js) - Google Analytics