前端性能优化:for in循环的优化
2016-07-03 10:15
267 查看
for in循环非常慢,但有时候却不能不使用,那有没有方法改进呢?
for in循环之所以慢,就是因为需要不停的遍历原型链,如果知道能够减少原型链的遍历就可以改进。
改进方法,就是需要遍历的属性明确列出来:
代码:
function createArr() {
var t = [];
for (var i = 0; i < 1000; i++) {
t[i] = { name1: 1, name2: i + 10, name3: i + 3 };
}
return t;
}
/*原始for in循环,复制数组*/
function Test1() {
var t = createArr();
var date1 = new Date().getTime();
var tcopy = [];
var length = t.length;
var total = 0;
for (var i = 0; i < length; i++) {
var obj = {};
for (var item in t) {
obj[item] = t[i][item];
}
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("1Test" + ((date12 - date1)));
}
/*for in改进 ,复制数组*/
function Test2() {
var t = createArr();
var date1 = new Date().getTime();
var names = ['name1', 'name2', 'name3'];
var lengthnames = names.length;
var tcopy = [];
var length = t.length;
for (var i = 0; i < length; i++) {
var obj = {};
for (var j = 0; j < lengthnames; j++) {
obj[names[j]] = t[i][names[j]];
}
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("2Test" + ((date12 - date1)));
}
/*jquery ,复制数组*/
function Test3() {
var t = createArr();
var date1 = new Date().getTime();
var names = ['name1', 'name2', 'name3'];
var lengthnames = names.length;
var tcopy = [];
var length = t.length;
for (var i = 0; i < length; i++) {
var obj = {};
obj=jQuery.extend(obj, t[i]);
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("3Test" + ((date12 - date1)));
}测试后,发现,改进后明确列出需要处理的属性,性能比原来的提高几百倍,比jQuery封装的方法性能高两倍。因此jQuery封装的这个方法还是不错的。
for in循环之所以慢,就是因为需要不停的遍历原型链,如果知道能够减少原型链的遍历就可以改进。
改进方法,就是需要遍历的属性明确列出来:
代码:
function createArr() {
var t = [];
for (var i = 0; i < 1000; i++) {
t[i] = { name1: 1, name2: i + 10, name3: i + 3 };
}
return t;
}
/*原始for in循环,复制数组*/
function Test1() {
var t = createArr();
var date1 = new Date().getTime();
var tcopy = [];
var length = t.length;
var total = 0;
for (var i = 0; i < length; i++) {
var obj = {};
for (var item in t) {
obj[item] = t[i][item];
}
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("1Test" + ((date12 - date1)));
}
/*for in改进 ,复制数组*/
function Test2() {
var t = createArr();
var date1 = new Date().getTime();
var names = ['name1', 'name2', 'name3'];
var lengthnames = names.length;
var tcopy = [];
var length = t.length;
for (var i = 0; i < length; i++) {
var obj = {};
for (var j = 0; j < lengthnames; j++) {
obj[names[j]] = t[i][names[j]];
}
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("2Test" + ((date12 - date1)));
}
/*jquery ,复制数组*/
function Test3() {
var t = createArr();
var date1 = new Date().getTime();
var names = ['name1', 'name2', 'name3'];
var lengthnames = names.length;
var tcopy = [];
var length = t.length;
for (var i = 0; i < length; i++) {
var obj = {};
obj=jQuery.extend(obj, t[i]);
tcopy.push(obj);
}
var date12 = new Date().getTime();
console.log("3Test" + ((date12 - date1)));
}测试后,发现,改进后明确列出需要处理的属性,性能比原来的提高几百倍,比jQuery封装的方法性能高两倍。因此jQuery封装的这个方法还是不错的。
相关文章推荐
- css3选择器
- jQuery插件版无缝轮播,重写了之前的代码,显得更高大上一点
- 剑指offer:用递归写23题
- jQuery中的noConflict机制
- 剑指offer-第三天
- JavaScript 实现使用时间差来转换倒计时效果。
- jsp中EL表达式获取数据
- APICloud css样式大全
- JS获取当前日期时间及JS日期格式化
- [leetcode]19. Remove Nth Node From End of List
- 1-2jQuery初体验
- JSP-导入taglib 出现classNotFound异常
- JavaScript 输出当前系统时间到页面指定位置。
- ajax跨域getjsonp
- ECIR 2016 Paper Beyond Factoid QA: Effective Methods for Non-factoid Answer Sentence Retrieval
- Nth to Last Node in List
- React Native 中 component 生命周期
- css做导航栏伸缩菜单
- 利用Jquery实现一个典型的form表单前端验证
- Remove Nth Node From End of List