2

数组篇

map()方法

map函数可以将函数作为参数传入,并将数组中每个元素代入函数进行处理返回,返回一个新的数组

arr.map(function (elem, index, arr) {...}, arg)

可以看出map可以传入两个参数,第一个参数中函数可以填入三个参数,elem:数组的元素,index:数组的索引,arr:数组本身
第二个参数用来绑定回调函数内部的this

var arr = [1, 2, 3, 4, 5, 6, 7];
var obj = {a : 3};
var new_arr = arr.map(function (elem) {
    if (this.a < elem) {
        return elem * 2;
    }
    else{
        return this.a;
    }
    
},obj);

console.log(new_arr);  // [3, 3, 3, 8, 10, 12, 14]

注意点:当元素为空位,undefined,null时map的表现

var count = 0;
var f = function (elem, index) {
    count ++;
};
[1, , 3].map(f);          //count 2
[1, null,3 ].map(f);      //count 3
[1, undefined, 3].map(f); //count 3

当元素是空位时map会跳过,undefined,null不会跳过

forEach()方法

forEach函数与map类似,也是遍历数组,代入函数,没有返回值;可以理解成只是将数组元素进行一些操作处理
个人觉得forEach能实现的,map也能实现

var arr = [];
[1, 2, 3].forEach(function (elem) {
    arr.push(elem * 2);
})

同理当元素是空位时forEach会跳过,undefined,null不会跳过

filter()方法

filter函数是过滤一些元素,当返回值为true时,保留元素,false时,舍去元素

var arr = [1, 2, 3].filter(function (elem) {
    if(elem > 2) {
        return 1;
    }
        return 0;
}); 
arr; //[3]

同理当元素是空位时forEach会跳过,undefined,null不会跳过

some(),every()方法

两个方法函数的都是布尔值
some函数,将数组遍历代入函数中,依次执行当一个满足条件就返回布尔值true,否则遍历完都不满足返回false
every函数,将数组遍历代入函数中,依次执行当一个不满足条件就返回布尔值false,否则遍历完都满足返回true
var count = 0
var bool = ["1", 2, 4].every(function (elem) {
    count ++;
    
    return (typeof elem === "number");
});
console.log(count, bool);    //1 false
var count = 0
var bool = [1, "2", "4"].some(function (elem) {
    count ++;
    
    return (typeof elem === "number");
});
console.log(count, bool);    //1 true

对于空位,null,undefined的执行
every()与some()一样:空位时会跳过,undefined,null不会跳过
当为空数组时([],[,]):
some()返回false,个人方便理解,遍历时一直在跳过,都不满足最后只好返回false
every()返回true,个人方便理解,遍历时一直在跳过,都满足最后只好返回true;

reduce()与reduceRight()

reduce函数的实现效果有点像斐波那契数列的味道

arr.reduce(function (prev, cur, index, arr) {}, arg)

reduce函数可以接受两个参数
第一个参数是函数,prev:累计变量,也就是上一次的执行结果;cur:当前变量;index:当前变量的索引;arr:操作的数组本身
第二个参数用来指定初始值,可以用于处理空数组

var f = function (prev, cur) {
    return prev + cur;
};
[].reduce(f, 1);     //1
[1, 2].reduce(f, 1); //4
[].reduce(f);        //报错Reduce of empty array with no initial value

有一个有趣的应用:查找数组中length最长的,利用参数prev的累计功能

var f = function (prev, cur) {
    return prev.length < cur.length ? cur : prev;
};
var lon = ['123', '11113','23','4322'].reduce(f);
console.log(lon);

reduceRight函数与reduce函数一样,只不过从后往前遍历数组
同理当元素是空位时reduce和reduceRight会跳过,undefined,null不会跳过

indexOf()与lastIndexOf()

indexOf函数返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1;
匹配规则用的是全等(===)
不填参数,返回-1
特别是匹配对象和NaN时,对象在全等下比较的是地址,而NaN不等于自身

var arr = [NaN, 1, {a : 1}];
console.log(arr.indexOf());              //-1
console.log(arr.indexOf(NaN));           //-1
console.log(arr.indexOf(1));             //1
console.log(arr.indexOf({a : 1}));       //-1

lastIndexOf()是从后往前找


Infinity
293 声望9 粉丝

学前端中,只想激情优雅的写代码