在日常使用中,说到for循环脑海中会冒出几种方法。但是如果要察觉它们之中的区别,就需要对这几种for循环进行一个系统性的实践性的总结。
在ES5中有三种循环 分别是 for , for…in , forEach
在ES6中新增了 for…of
常见写法
const arr = [1, 2, 3]; for(let i = 0; i < arr.length; i++) { console.log(arr[i]); }
如果数组长度在循环过程中不会改变,将数组长度用变量存储起来会获得更好的效率,改进后的写法:
const arr = [1, 2, 3]; for(let i = 0, len = arr.length; i < len; i++) { console.log(arr[i]); }
循环遍历对象的属性
循环数组
const arr = [1, 2, 3]; for(let index in arr) { console.log("arr[" + index + "] = " + arr[index]); } // 输出结果如下 // arr[0] = 1 // arr[1] = 2 // arr[2] = 3
循环对象
const person = { fname: "san", lname: "zhang", age: 29 }; let info; for(info in person) { console.log("person[" + info + "] = " + person[info]); } // 输出结果如下 // person[fname] = san // person[lname] = zhang // person[age] = 29
const arr = [1, 2, 3]; arr.forEach((data) => { console.log(data); }); // 输出结果如下 // 1 // 2 // 3
forEach 方法为数组中含有有效值的每一项执行一次 callback 函数,那些已删除(使用 delete 方法等情况)或者从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。 callback 函数会被依次传入三个参数:
添加数组当前项的索引参数,注意callback 函数中的三个参数顺序是固定的,不可以调整。
let arr = [1,2,3]; arr.forEach((item,index,arr) => { console.log(item,index,arr) });
需要注意的是,forEach 遍历的范围在第一次调用 callback 前就会确定。调用forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。
ES6中引入的新的循环
主要用于解决其他for循环的缺陷
let arr = [1,2,3] for(item in arr){ console.log(item) } //1 //2 //3
ES6之前的三种for循环有什么缺陷?
所以,鉴于以上种种缺陷,我们需要改进原先的 for 循环。但 ES6 不会破坏你已经写好的 JS 代码。目前,成千上万的 Web 网站依赖 for-in 循环,其中一些网站甚至将其用于数组遍历。如果想通过修正 for-in 循环增加数组遍历支持会让这一切变得更加混乱,因此,标准委员会在 ES6 中增加了一种新的循环语法来解决目前的问题,即 for-of 。