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吧,而且我写的那个插件不可能出现这么大数据量的场景,这点性能差异就忽略吧。
分享到:
相关推荐
这篇文章主要介绍了JS合并两个数组的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要将两个数组合并成为一个的情况。比如: var a = [1,2,3];...
使用链式编程写法实现Java中byte数组的拼接。例如byte[] bytes = ByteUtils.get().add(0x41).add(07).add(11).add("15288930000").add(0x45).toArray();更灵活用法请参考Mybytes
这个实现起来虽然不难,但是涉及到PHP中几个不常用的函数模块,对于很多PHP新手来说还确实是一个难题,今天就给大家分享一个实例,用4行代码就可以实现让PHP随机从数组中选取几个值,然后拼接成字符串并输出。...
将数据按字节塞进byte数组
C#中的三种字节数组拼接方式的性能对比测试DEMO。 博文地址:http://blog.csdn.net/sqqyq/article/details/50986977
php接口查询到的多个数组进行拼接后返回
两个json数组合并去重,以及删除某一项元素 let ha = [ {id:'H',name:'3'}, {id:'A',name:'6'}, {id:'B',name:'14'}, {id:'C',name:'60'} ]; let hb= [ {id:'H',name:'2'}, {id:'A',name:'6'}, {id:'B',...
撰写时间:2017.5.23 一维数组 1.numpy初始化一维数组 a = np.array([1,2,3]); print a.shape 输出的值应该为(3,) 二维数组 2.numpy初始化二维数组 ...a = np.array([[1,2,3]]);...但是两个数组能拼接的
js 遍历数组取出字符串用逗号拼接;js 如何获取循环出来的最后一个i或者取i的最大值
自定义byte数组,可变长度,轻量高效,解决集合存储简单数据的包装问题,自增缓存减少运算,方便多次调用,非线程同步
matlab开发-多维数组的合并排序。使用合并排序技术对单个或多维数组进行排序。
// res得到两个数组中交集 [2,2,3,4] var res = arr1.filter(function (item, index) { // 那arr1中的数据 去arr2数组中检测在arr2是否存在 // arr2.indexOf(item) 检测arr2中否是有 item这个数据 // 有数据就...
达梦数据库数组类型定义和数组内元素增加/删除/查询
该资源给出了Matlab中关于三维数组的相关操作,包括:访问三维数组中的元素,取三维数组中每个二维矩阵的对角线元素,三维数组转置,对三维数组中每层的二维矩阵进行求和,对三维数组中每层的二维矩阵进行平均值计算...
labVIEW 在获取数据的时候,1D数组中会存在重复的元素,那么当以想要知道重复元素有什么,和重复元素的个数是,就可以用本VI 进行数据解析。同时会做一下数据拼接,将元素以及元素数输出。
今天小编就为大家分享一篇Vue 通过公共字段,拼接两个对象数组的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了Java实现把两个数组合并为一个的方法,结合实例形式总结分析了java常用的四种数组合并操作技巧,需要的朋友可以参考下
下面小编就为大家分享一篇java 判断一个数组中的数值是否连续相邻的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉,如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。如样例1,获得长度3,先遍历第一...