<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = new Array();
for(let i=0; i<10000000; i++){
arr.push(i);
}
//for将数组累加
function forAdd (mayArr){
let sum = 0;
for(let i=0; i<mayArr.length; i++){
sum += mayArr[i]
}
}
//for in 将数组累加
function forInAdd(mayArr){
let sum = 0;
for(let key in mayArr){
sum += mayArr[key];
}
}
//测试时间
function timeTest( fun, mayArr, str) {
let start_time,end_time;
start_time = new Date().getTime();
fun(mayArr);
end_time = new Date().getTime();
console.log(str,end_time-start_time)
}
timeTest(forAdd, arr, 'forAdd');
timeTest(forInAdd, arr, 'forInAdd');
</script>
</body>
</html>
结果:
当数据比较大的时候 性能差别还是很明显的;
原因主要有以下几点:
1.for...in的key是String类型,而非数字,它包含当前属性的名称或当前数组元素的索引,有转换过程,因此开销比较大;但是for循环的i是Number类型,开销较小。
2.for-in是用来迭代对象的属性或数组的每个元素,它需要穷举对象的所有属性,包括自定义的添加的属性也能遍历到,而for则是通过number遍历,因此开销较小。因此,for-in 大多时候用来遍历对象,而非遍历数组,遍历数组建议用for。