JS19 -- 循环和遍历各方法比较
for...in index
for...of item
forEach index,item,all
filter index,item,all return 新数组,原数组不变(1层的情况)
map index,item,all
some index,item,all
every index,item,all
1、for...in:
①. 返回下标
②. 只遍历可枚举的,如果设置某下标为不可枚举,则不展示Object.defineProperty(arr,index,{enumrable:false})
③. 还会遍历继承的, Array.prototyp.my = 'shabi'; 也会遍历出来,可以通过hasOwnProperty判断有没有这个属性(非继承)
④. 对象遍历不安顺序{"2":'ef',"a":'fefe',"1":"feffgeef"}
⑤. 数组通过对象方式添加属性,array.text = 1;只有for...in能打印出
2、forEach:
①. 返回值,下标,原数组
②. 没办法使用 break /continue语句跳出循环,或者使用return从函数体内返回(可以抛出错误,trycatch接受)
优点传入函数使变量不会污染全局
3、for...of
①. 返回值
②. 获取下标转为Map
②. 可以使用 break, continue 和 return
③. 除支持数组,还支持字符串,Set,Map(let [key,value] of xxxMap),对象
⑤. 代替for...in和forEach
Array.prototype.bb = 'efefef'; let arrA = [ {id:1, name: 'AA', url: '/ueijfejf'}, {id:2, name: 'BB', url: '/ueijfejf'}, {id:3, name: 'CC', url: '/ueijfejf'}, {id:4, name: 'DD', url: '/ueijfejf'}, {id:5, name: 'EE', url: '/ueijfejf'}, ] arrA['efefe'] = {id:0} Object.defineProperty(arrA,'efefe',{ enumerable: false }) Object.defineProperty(arrA,0,{ enumerable: false }) Object.defineProperty(arrA,2,{ enumerable: false }) console.log('for...in-start') for(let item in arrA){ console.log(item); } console.log('for...in-end') console.log('forEach-start') arrA.forEach((item)=>{ console.log(item) }) console.log('forEach-end') console.log('for...of-start') for(let item of arrA){ console.log(item); } console.log('for...of-end')
4、filter
过滤数组
arr.filter((item,index,oldArr)=>{true}); // return 为true的item,生成新的数组,否则[]
5、map
arr.map((item,index,oldArr)=>{ });
https://segmentfault.com/a/1190000018340362
https://www.cnblogs.com/qdlhj/p/9916324.html
https://www.baidu.com/s?ie=UTF-8&wd=map%20%E5%92%8C%20for%20of
6、some
通过提供函数返回匹配到第一个满足返回true,否则返回false,不改变原数组
7、every
通过提供函数返回匹配到所有满足返回true,否则返回false,不改变原数组