for-in
- 获取数组的索引值
- 循环遍历所有的值,包含原型链上的,性能差
- 返回数组中所有可枚举的属性,包含原型链上的
- 更适用于对象遍历
- 可以正确响应break、continue和return语句
let arr = [1, 2, 3, 4, 'string']
Array.prototype.name = '我是原型里面的属性'
for (let i in arr) {
console.log(i) // 0, 1, 2, 3, 4, name
console.log(arr[i]) // 1, 2, 3, 4, '我是原型里面的属性'
}
for-of (ES6)
- 获取数组的值
- 只会遍历当前数组对象,不会遍历原型链
- 返回数组对象所有的值
- 适用遍历数组/字符串
- 可以正确响应break、continue和return语句
let arr = [1, 2, 3, 4, 'string']
Array.prototype.name = '我是原型里面的属性'
for (let item of arr) {
console.log(item) // 1, 2, 3, 4, 'string'
}
forEach(ES5)
- 默认索引只能从0开始
- 使用break不能中断循环,使用return也不能返回到外层函数
- 在循环的时候,会跳过空值
- foreach在循环次数未知或者计算起来较复杂的情况下效率比for循环高
- foreach循环时循环对象(数组、集合)被锁定,不能对循环对象中的内容进行增删改操作
语法:array.forEach(callback(currentvalue,index,arr) ,thisValue)
callback为数组中每个元素执行的函数,该函数可接受1-3个参数:
- currentvalue参数表示数组的当前元素项,必须的参数
- index参数表示的当前元素下标,可选参数
- arr参数表示当前元素所属的数组,可选参数
thisValue表示执行回调函数callback()时的this指向。可选参数。不写时,则默认是指向window全局
let arr = [1, 2, 3, 4, 'string']
Array.prototype.name = '我是原型里面的属性'
arr.forEach((item, index) => {
console.log('item', item) // 1, 2, 3, 4, 'string'
console.log('index', index) // 0, 1, 2, 3, 4
}
)