2
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().


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]);
}

liaojin1
170 声望2 粉丝

菜啊