for
简单的一种循环遍历方法,使用频率最高的一种,优化版本--使用临时变量,将长度缓存起来,避免重复获取数组长度数据量大,性能比较好
let arr=['a','b','c','d']
for(let j = 0,len=arr.length; j < len; j++) {
console.log(arr[j])
}
forEach
数组自带的foreach循环,使用频率较高,实际上性能比普通for循环弱
let arr=['a','b','c','d']
try{
arr.forEach((key,index,array)=>{
console.log(key,index)
if(key==='a'){
throw new Error("LoopJump")
}
})
}catch(err){
}
//key是数组里的值,index为数组里元素的索引
//第三个参数则是它自己(利用第三个参数可以进行数组去重)
//使用try...catch...可以跳出循环
注意:不能使用break和continue跳出整个循环或当前循环的,会报错,但是结合try...catch可以实现跳出循环
for...of 和 for...in 及其区别
性能要好于 for..in...,但仍然比不上普通的 for 循环,for..in... 效率最低(输出的 key 是数组索引),不建议数组遍历使用,适合遍历对象,输出的则是对象的属性名
let arr=['a','b','c','d']
for(let i in arr){
console.log(`for in 输出i为每一项的下标---${i}`,arr[i])
}
for(let i of arr){
console.log(`for of 输出i为数组里边的每一项---${i}`)
}
区别:for..in...数组每一项下标 for..of...数组每一项值
衍生:for...of循环内部调用的是数据结构的Symbol.iterator方法,Set 和 Map 结构也原生具有 Iterator 接口,可以使用for...of循环,Object不具有,所以不支持for...of
map 和 filter 及其区别——ES6
- (
map一一对应)遍历每一个元素并且返回处理后的元素,返回创建的新数组和原来旧数组的长度是一样的,使用比较广泛,但其性能还不如forEach
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let newArr=arr.map((k,i,array)=>{
k.age++;
return k
})
console.log(newArr)
//参数k数组每一项,i数组每一项下标,array原数组
//返回新数组,长度和原数组一样
//操作每一项会改变元数组
//不想改变使用结构解构返回新的值...
let newArr=arr.map((k,i,array)=>{
return {
...k,
add:111
}
})
filter遍历数组,过滤出符合条件的元素并返回一个新数组,没有符合条件的元素则返回空数组,不改变原数组
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let newArr=arr.filter((k,i,array)=>{
k.name=k.name+'_add'
return k.age==18
})
console.log(arr,newArr)
//arr name改变,newArr:[{name:'liu_add',age:18}]
区别:都返回新数组,map数组长度不变,filter根据过滤情况而定。都可以改变元素属性值,并且影响原数组
some和every——ES6
some遍历数组,只要有一个以上的元素满足条件就返回 true,否则返回 false
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let bool=arr.some((k,i,array)=>{
return k.age==18
})
console.log(bool)
//true
every遍历数组,每一个元素都满足条件 则返回 true,否则返回 false
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let bool=arr.every((k,i,array)=>{
return k.age==18
})
console.log(bool)
//false
find和findIndex——ES6
find遍历数组,返回符合条件的第一个元素,没有符合条件的元素则返回 undefined
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let newArr=arr.find((k,i,array)=>{
return k.age==18
})
console.log(newArr) //{name: 'liu', age: 18}
findIndex遍历数组,返回符合条件的第一个元素的索引,没有符合条件的元素则返回 -1
let arr=[{name:'liu',age:18},{name:'li',age:20}]
let newArr=arr.findIndex((k,i,array)=>{
return k.age==18
})
console.log(newArr) //0