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吧,而且我写的那个插件不可能出现这么大数据量的场景,这点性能差异就忽略吧。
分享到:
相关推荐
- `push()`:在数组末尾添加一个或多个元素,并返回新的长度。 - `pop()`:移除并返回数组的最后一个元素。 - `shift()`:移除并返回数组的第一个元素。 - `unshift()`:在数组开头添加一个或多个元素,并返回新...
5. `push()`:在数组末尾添加一个或多个元素,并返回新长度。 6. `pop()`:删除并返回数组的最后一个元素。 7. `shift()`:删除并返回数组的第一个元素。 8. `unshift()`:在数组开头添加一个或多个元素,并返回新...
- `map()` 创建一个新的数组,新数组中的元素是原数组元素经过函数处理后的结果。 - `for...of` 循环遍历数组的可迭代属性,如 `for (let item of arr) {...}` 4. **添加元素** - `push()` 在数组末尾添加元素,...
例如,`myArray.push(value)` 可以向数组末尾添加元素,`myArray.pop()` 则可以移除最后一个元素。 2. **数组和对象的关系**:在JavaScript中,数组本质上是特殊的对象,因为它们的键是数字(即索引),而值可以是...
3. `push()`方法用于向数组的末尾添加一个或多个元素,并返回新的数组长度。 ```javascript var a = [1, 2, 3]; var newItem = a.push('末尾'); // a变为[1, 2, 3, '末尾'], newItem为4 ``` 4. `unshift()`方法用于...
例如,我们可以预先创建一个空数组`buffer`,然后通过索引直接添加元素(如`buffer[i++] = "string"`)而不是使用`push`方法,因为直接通过索引赋值通常更快。最后,通过`join`方法将数组中的所有元素合并成一个字符...
Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 ... 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话...
3. push()方法:在数组的尾部添加一个或多个元素,并返回新的长度。 4. pop()方法:移除数组的最后一个元素,并返回被移除的元素。 不修改原数组的方法包括: 1. concat()方法:用于合并两个或多个数组。此方法...
### JavaScript中的两种字符串拼接方法 在Web开发中,JavaScript是一种非常重要的客户端脚本语言,被广泛用于网页的动态效果实现、数据处理等场景。本文将详细介绍JavaScript中两种常见的字符串拼接方法及其应用...
本篇文章将介绍两种方法来实现这个功能,具体针对以下需求:从给定的字符串数组中找出所有字符顺序不同的字符串组合。 首先,我们来看第一种方法: ```javascript var stringClassify = function(arr) { var ...
这里用到了array_push()函数,它可以将一个或多个元素添加到数组的末尾。值得注意的是,此处的数组$oc是一个包含字符串条件的数组,最终可以被用于构建动态SQL查询语句,对数据库进行条件筛选。 通过以上步骤,我们...
邻接表和邻接矩阵是图数据结构的两种常见表示方式。邻接表适合表示稀疏图,即边的数量远小于顶点数量的平方;而邻接矩阵则适用于表示稠密图,即边的数量接近顶点数量的平方。这两种数据结构在图遍历、最短路径计算等...
堆栈的基本操作包括压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek)和检查栈是否为空(IsEmpty)。C/C++中可以使用数组或链表来实现堆栈。 接下来是树(Tree)。树是一种非线性数据结构,由节点和边构成,每个...
它具有丰富的内置对象和方法,其中数组是一个重要的数据结构,用于存储和操作有序的元素集合。JavaScript中的数组操作方法非常丰富,包括但不限于判断数组、数组元素的增加与删除、数组排序、数组元素的拼接等。 ...
在浏览器性能测试中,使用长度为130的数组和不同长度的元素进行1000次迭代,结果显示,直接使用`join()`的方法通常比其他两种方法更快。这是因为`join()`是JavaScript引擎内置的方法,其内部优化可能比手动操作更...
这种方法是通过创建一个空对象`obj`作为哈希表,遍历数组,将元素作为键存入对象。由于JavaScript对象的键是唯一的,因此重复的元素将被忽略。这种方法简单快捷,但在某些情况下可能不准确,例如`1`和`'1'`会被认为...
在`unique`方法内部,创建一个空对象`hash`作为哈希表,同时初始化一个空数组`result`用于存放不重复的元素。遍历数组中的每个元素,如果`hash`中不存在该元素作为键,则将其添加到`hash`中并将其推入`result`数组。...
数组的拼接可以通过concat()方法实现,该方法不会改变现有的数组,而是返回一个新数组,新数组的内容是原数组和参数中数组的元素的组合。slice()方法则用于提取原数组的一部分,返回一个新的数组对象。位置方法index...
模拟StringBuffer类的方式之一是通过创建一个数组,然后利用数组的push()方法来添加字符串片段,最后使用join()方法将数组中的所有字符串片段连接成一个完整的字符串。这样做的优势在于,在数组中追加字符串片段的...