javascript 三种数组复制方法的性能对比
作者:bea
一. 三种数组复制方法 1. by slice var arr = [1, 2, 3], copyArr; copyArr = arr.slice(); 2. by concat var arr = [1, 2, 3], copyArr; copyArr = arr.concat(); 3. by loop var arr = [1, 2, 3], copyArr = []; for (var i=0, j=arr.length; i 二. 测试环境 浏览器: IE6+, F
一. 三种数组复制方法 1. by slice var arr = [1, 2, 3], copyArr; copyArr = arr.slice(); 2. by concat var arr = [1, 2, 3], copyArr; copyArr = arr.concat(); 3. by loop var arr = [1, 2, 3], copyArr = []; for (var i=0, j=arr.length; i 二. 测试环境 浏览器: IE6+, FF 3.5.5, Opera 10, Chrome 4.0.249, Safari 4.0.3 三. 测试用例 用上面3种方法, 对一个拥有500000项的数组进行复制操作, 然后对比3种方法所耗掉的时间.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>3种数组复制方法的性能对比</title>
<meta name="description" content="数组复制, slice, concat" />
<meta name="keywords" content="数组复制, slice, concat" />
</head>
<body>
<div class="section">
<p>我们以一个拥有500000个子项的数组, 作为测试对象(IE不会崩溃哦!).</p>
<button id="J_CopyBySlice">copyBySlice</button>
<button id="J_CopyByConcat">copyByConcat</button>
<button id="J_CopyByLoop">copyByLoop</button>
</div>
<script type="text/javascript">
(function() {
var arr = [];
for (var i=0; i<500000; i++) {
arr.push(i);
}
var get = function(id) {
return document.getElementById(id);
};
var bySlice = function() {
return arr.slice();
};
var byConcat = function() {
return arr.concat();
};
var byLoop = function() {
var newArr = [];
for (var i=0, j=arr.length; i<j; i++) {
newArr.push(arr[i]);
}
return newArr;
};
var showResult = function(way, el) {
var st = +new Date(),
oMsg,
newArr;
switch (way) {
case 'slice':
newArr = bySlice();
break;
case 'concat':
newArr = byConcat();
break;
case 'split':
newArr = bySplit();
break;
case 'loop':
newArr = byLoop();
break;
}
oMsg = document.createElement('p');
oMsg.innerHTML = 'copy by ' + way + ' use time: ' + (+new Date() - st) + 'ms';
el.parentNode.appendChild(oMsg);
};
get('J_CopyBySlice').onclick = function() {
showResult('slice', this);
}
get('J_CopyByConcat').onclick = function() {
showResult('concat', this);
}
get('J_CopyByLoop').onclick = function() {
showResult('loop', this);
}
})();
</script>
</body>
</html>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
四. 测试结果(点图片可查看大图)
五. 结论
对于IE, 使用slice; 非IE, 使用concat.
对于webkit, 使用concat; 其他浏览器, 使用slice.
有用 | 无用
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>3种数组复制方法的性能对比</title>
<meta name="description" content="数组复制, slice, concat" />
<meta name="keywords" content="数组复制, slice, concat" />
</head>
<body>
<div class="section">
<p>我们以一个拥有500000个子项的数组, 作为测试对象(IE不会崩溃哦!).</p>
<button id="J_CopyBySlice">copyBySlice</button>
<button id="J_CopyByConcat">copyByConcat</button>
<button id="J_CopyByLoop">copyByLoop</button>
</div>
<script type="text/javascript">
(function() {
var arr = [];
for (var i=0; i<500000; i++) {
arr.push(i);
}
var get = function(id) {
return document.getElementById(id);
};
var bySlice = function() {
return arr.slice();
};
var byConcat = function() {
return arr.concat();
};
var byLoop = function() {
var newArr = [];
for (var i=0, j=arr.length; i<j; i++) {
newArr.push(arr[i]);
}
return newArr;
};
var showResult = function(way, el) {
var st = +new Date(),
oMsg,
newArr;
switch (way) {
case 'slice':
newArr = bySlice();
break;
case 'concat':
newArr = byConcat();
break;
case 'split':
newArr = bySplit();
break;
case 'loop':
newArr = byLoop();
break;
}
oMsg = document.createElement('p');
oMsg.innerHTML = 'copy by ' + way + ' use time: ' + (+new Date() - st) + 'ms';
el.parentNode.appendChild(oMsg);
};
get('J_CopyBySlice').onclick = function() {
showResult('slice', this);
}
get('J_CopyByConcat').onclick = function() {
showResult('concat', this);
}
get('J_CopyByLoop').onclick = function() {
showResult('loop', this);
}
})();
</script>
</body>
</html>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
四. 测试结果(点图片可查看大图)
五. 结论
对于IE, 使用slice; 非IE, 使用concat.
对于webkit, 使用concat; 其他浏览器, 使用slice.
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- JavaScript 学习笔记(十五)
- Extjs 几个方法的讨论
- JavaScript 判断判断某个对象是Object还是一个Array
- 图像替换新技术 状态域方法
- javascript innerText和innerHtml应用
- js 右键菜单,支持不同对象不同菜单(兼容IE、Firefox)
- 使用JavaScript库还是自己写代码?
- js或css实现滚动广告的几种方案
- jquery中的sortable排序之后的保存状态的解决方法
- javascript面向对象的方式实现的弹出层效果代码
- js提示信息jtip封装代码,可以是图片或文章
- jquery 常用操作方法
- jquery 经典动画菜单效果代码
- 使用JQuery进行跨域请求
- JavaScript 使用简略语法创建对象的代码
- javascript 的Document属性和方法集合
- 起点页面传值js,有空研究学习下
- javascript 自动标记来自搜索结果页的关键字
- js 多层叠的TAB选项卡