for循环
for循环属于命令式编程。
优点:程序员可以自由的控制循环的开始和结束,可玩性更高。
缺点:书写较为繁琐。
forEach循环
Array的forEach、map等等循环属于函数式编程。
优点:使用方便,代码更易阅读,方便维护。
缺点:无法精确管理过程,性能上也有所消耗。
plus:forEach底层实现就是对for循环的封装。
for in 循环
for in 循环一般用来遍历对象的属性。
for in 循环的性能很差。
特点:可以遍历到非Symbol类型、可枚举的以及继承的属性。遍历时以数字类型优先。
例如:
const obj = {
name: '小猪佩奇',
age: '3岁',
[Symbol('secret')]: '秘密',
2: '2',
1: '1'
}
Object.prototype.mySelf = 'Object新增属性'
for (key in obj) {
console.log(obj[key])
}
console.log('-----------------------')
for (key in obj) {
console.log(key)
}
运行结果:
for in 中只遍历自身属性的解决方案:使用Object.prototype.hasOwnProperty(key) 判断该属性是非是自己的属性,不是就break。
for of 循环
for of 循环是基于迭代器规范的循环,只能遍历实现了iterator接口的数据类型的遍历。
Array以及es6中新增的Set、Map都实现了该接口。故可以直接使用for of 循环。
常见的引用数据类型对象(Object)没有实现iterator接口,不能使用for of 循环,我们可以手动实现该接口来根据自己的需求自定义迭代规则。
例如:
Object.prototype[Symbol.iterator] = function () {
let _self = this
let index = 0
let keys = Reflect.ownKeys(_self)
return {
next() {
if (index < keys.length) {
return { value: _self[keys[index++]], done: false }
}
return { value: undefined, done: true }
}
}
}
const obj = {
name: '小猪佩奇',
age: '3岁',
[Symbol('secret')]: '秘密',
2: '2',
1: '1'
}
Object.prototype.mySelf = 'Object新增属性'
for (item of obj) {
console.log(item)
}
运行结果:
小结
js中循环的使用方式多种多样,在实际开发中在对应的场景下使用合适的循环,有利于提高代码质量,方便项目的维护。