forEach,map,filter区别
forEach
遍历数组经常使用(调用数组的每一个元素,并将元素传递给回调函数)数组
let arr = [1,2,3,4,5]; arr.forEach((i)=>{ console.log(i);//1 2 3 4 5 });
这种循环的问题在于没法中途跳出循环,break和return命令不能奏效.
map和filter都返回数组,map返回的与原数组长度相同函数
map
let arr = ['a','b','c','d']; let newArr = arr.map((val,key)=>{ if(val=='c'){ return val;} }); console.log(newArr);//[undefined,undefined,'c',undefined];
filter
let arr = ['a','b','c','d']; let newArr = arr.filter((val,key)=>{ if(val=='c'){ return val; } }); console.log(newArr);//['c']
只返回符合条件的结果一个值
every和some返回布尔值设计
for-in
遍历对象全部的可枚举属性(主要是为了遍历对象而设计的,不适用于遍历数组)功能相似于Object.keys().code
let obj = { name:'xiaoming', age:15 } for(let item in obj){ console.log(item);//name age }
不可枚举的对象:如constructor,数组的length对象
let arr = [10, 20, 30, 40, 50]; for (let item in arr) { console.log(item); // '0' '1' '2' '3' '4' }
数组的键名是数字,可是for-in循环是以字符串做为键名‘0’、‘1’、‘2’等.索引
for-of
全部实现了[Symbol.iterator]接口的对象均可以被遍历。能够使用的范围包括数组、Set 和 Map 结构、某些相似数组的对象(好比arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串
for..of获取索引
.entries()返回键值对
.keys()返回键名
.values()返回键值
相似数组的对象:如字符串DOM NodeList 对象、arguments对象等接口
let str = 'hi'; for(let i of str){ console.log(s); }//h i let item = document.querySelectorAll('p'); for(let a of item){ a.classList.add('test'); } (function(){ for(let x of arguments){ console.log(x); } })('a','b'); //'a' //'b'
并不是全部相似数组的对象都有iterator接口,使用Array.from()将其转化为数组字符串
let ar = {length:2,0:'a',1:'b'}; for(let i of ar){ console.log(i);//报错 } for(let i of Array.from(ar)){ consle.log(i);//'a' 'b' }
普通对象不能直接使用for-of会报错,由于没有iterator接口,for-in能够直接使用,若非要使用for-of须要使用Object.keys方法将键名生成一个数组,而后遍历这个数组。回调函数
for(let key of Object.keys(obj)){ console.log(key+' '+obj[key]); }