前端面试系列-JavaScript-for ... in和for...of
一、for … in、for…of区别
1.for … in
for…in 循环一般用于对象的遍历,不适用于遍历数组。
遍历数组的缺点:数组的下标 index 值是数字,for-in遍历的 index值"0",“1”,"2"等是字符串。存在一个转换过程,降低性能
任何对象都继承了Object对象,继承的类的属性是默认不可遍历的,for… in 循环遍历的时候会跳过,但是这个属性是可以更改为可以遍历的,那么就会造成遍历到不属于自身的属性。 可以用hasOwnProperty() 方法,在循环内部判断一下,某个属性是否为对象自身的属性。
2. for…of
for…of 循环不仅支持数组,还支持大多数类数组对象,也支持字符串遍历。 for…of 它可以正确响应 break、continue 和 return 语句。
3.区别
-
for in 一般常用来遍历对象或json,不适用于遍历数组。 for of数组对象都可以遍历,遍历对象需要通过和Object.keys() for in循环出的是key,for of循环出的是value 遍历对象时,for in,包括原型链上的属性,需要用hasOwnProperty()判断;for of + Object.keys()得到的是自身可枚举属性
二、转为ES5代码
ES6代码
let arr = [1,2,3,4]
for(let item of arr){
console.log(item)
}
for(let index in arr){
console.log(arr[index])
}
let obj = {
name:"小强",
age:23
}
for(let item of Object.keys(obj)){
console.log(obj[item])
}
for(let index in obj){
console.log(obj[index])
}
转为ES5:
"use strict";
var arr = [1, 2, 3, 4];
for (var _i = 0, _arr = arr; _i < _arr.length; _i++) {
var item = _arr[_i];
console.log(item);
}
for (var index in arr) {
console.log(arr[index]);
}
var obj = {
name: "小强",
age: 23
};
for (var _i2 = 0, _Object$keys = Object.keys(obj); _i2 < _Object$keys.length; _i2++) {
var _item = _Object$keys[_i2];
console.log(obj[_item]);
}
for (var _index in obj) {
console.log(obj[_index]);
}
可以看到转成ES5代码后, for…of 就是用for实现的。
三、性能比较
let arr = new Array();
for(let i = 0, len = 1000000;i < len; i++){
arr.push(i);
}
function foradd(my_arr){
let sum = 0;
for(let i = 0; i < my_arr.length; i++){
sum += my_arr[i];
}
}
function forinadd(my_arr){
let sum = 0;
for(let key in my_arr){
sum += my_arr[key];
}
}
function forofadd(my_arr){
let sum = 0;
for(let val of my_arr){
sum += val;
}
}
function timeTest(func,my_arr,str) {
var start_time = null;
var end_time = null;
start_time = new Date().getTime();
func(my_arr);
end_time = new Date().getTime();
console.log(str,(end_time - start_time).toString());
}
timeTest(foradd,arr,foradd);
timeTest(forinadd,arr,forinadd);
timeTest(forofadd,arr,forofadd);
// foradd 6
// forinadd 294
// forofadd 20
for > for…of > for…in
-
for循环的i是Number类型,开销较小 for…in需要穷举对象的所有属性,包括自定义的添加的属性也能遍历到 且for…in的key是String类型,有转换过程,开销比较大
上一篇:
Java基础知识总结(2021版)
下一篇:
实现高效的英文单词前缀匹配
