ES5

建议看张鑫旭的es5

es5新增加:

  • forEach (js v1.6)
  • map (js v1.6)
  • filter (js v1.6)
  • some (js v1.6)
  • every (js v1.6)
  • indexOf (js v1.6)
  • lastIndexOf (js v1.6)
  • reduce (js v1.8)
  • reduceRight (js v1.8)
浏览器支持

Opera 11+
Firefox 3.6+
Safari 5+
Chrome 8+
Internet Explorer 9+
对于不兼容的ie6和,e7和ie8可以在原型上添加的对应的方法。

if (typeof Array.prototype.forEach != "function") {
  Array.prototype.forEach = function () {
    /* 实现 */
  };
}
一、forEach()//用来遍历数组,不用繁琐的for循环遍历了。
[1,2,3,4].forEach(function(i){alert(i)})
//等价于
var arr=[1,2,3,4];
for(var i=0;i<arr.length;i++){
    alert(i)
}
//由此可见forEach方法方便很多,以后在编码尽量使用。

显而易见,forEach方法中的function回调支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身
也就是:arr.forEach(value,index,arr){}
对比jquery里面的。
$.each(arr,function(index,value,arr)){}
下面是一个数组求和的小栗子:

var sum=0;
var arr=[1,2,3];
arr.forEach(function(value,i,arr){
    sum+=value;
    console.log(arr[i]==value)//true
});
console.log(sum);

再下一步forEach()不仅可以接受一个回掉函数,还可以接受一个可选的上下文参数(用来改变回掉函数this的指向);

//    判断是张家人就发送邮件
    var database={
        user:["张韶涵","江一燕","李小璐"],
        sendEail:function (user) {
            if (this.isvailsUser(user)){
                console.log("你好"+user+"我们是一家人");
            }else {
                console.log("抱歉"+user+"你不是我们张家的人");
            }
        },
        isvailsUser:function (user) {
            return /^张/.test(user);
        }
    };
    database.user.forEach(database.sendEail,database);
    //得到的启发:这就是一件事,给性张的发邮件,所以封装到一个对象里面最好
    //如果这第2个可选参数不指定,则使用全局对象代替(在浏览器是为window),严格模式下甚至是undefined.

另外,forEach不会遍历纯粹“占着官位吃空饷”的元素的,例如下面这个例子:

var  arr=[1,2,3];
delete(arr[1]);//此时2被删除了,但是仍然占着那个位置。
alert(arr);1,,3;
console.log(arr.length)//3

but

arr.forEach(alert);//仅仅弹出来的是1,3 他不会遍历为空的元素

综上所述,接下来我们来对于ie6-ie8的forEach的扩展。

if (typeof Array.prototype.forEach != "function") {
  Array.prototype.forEach = function (fn, context) {
    for (var k = 0, length = this.length; k < length; k++) {
      if (typeof fn === "function" && Object.prototype.hasOwnProperty.call(this, k)) {
        fn.call(context, this[k], k, this);//利用原生的call方法 吧fn的this换成context.
      }
    }
  };
}   

二、map方法(同forEach方法类似)用发:[].map();
map方法的作用不难理解,“映射”嘛,也就是原数组被“映射”成对应新数组。下面这个例子是数值项求平方:

var data = [1, 2, 3, 4];
var arrayOfSquares = data.map(function (item) {
  return item * item;
});

alert(arrayOfSquares); // 1, 4, 9, 16

map的回掉函数必须有返回值。
否者

var arr=[1,2,3,4];
var arr2=arr.map(function(){});
arr2.forEach(console.log)//值都是undefined;

在实际的使用,我们可以使用map方法方便的获取对象数组 里面的特定的属性值,例如下面的这个例子。

var users=[
    {name:"张涵予",eamil:"zhang@email.com"},
    {name:"江一燕","eamil":"jiang@eamil.com"},
    {name:"李小璐","eamil":"li@email.com"}
]
var emails=users.map(function(user){
return user.email
})

map的兼容

if (typeof Array.prototype.map != "function") {
  Array.prototype.map = function (fn, context) {
    var arr = [];
    if (typeof fn === "function") {
      for (var k = 0, length = this.length; k < length; k++) {      
         arr.push(fn.call(context, this[k], k, this));
      }
    }
    return arr;
  };
}

三、filter 过滤。刷选,filer过滤掉数组不需要的元素,返回过滤后的新组数,用法同map相似

array.filter(callback,[thisObject]);

filter的回调函数返回boolean为true的值

var arr=[1,3,4,5,0];
var arr2=arr.filter(function(item){
    return item;//为true则返回回去
})
//arr2=[1,3,4,5];
var arr2=arr.filter(function(item){
    return item=="3";
})
//arr2=[3];
if(Array.prototype.filter!=="function"){
        Array.prototype.filter=function (fn,context) {
            var arr=[];
            if(typeof  fn==="function"){
                for (var k=0;k<this.length;k++){
                    fn.call(context,this[k],k,this)&&arr.push(this[k]);
                }
            }
            return arr;
        }
    }

四、indexOf
用法:同字符串的indexOf一样。
arr.indexOf(str,index);str:为索引的内容,index为从第几项开始找(包括这一项);

var arr=[1,2,3,4];
arr.indexOf(2,"x")//此时的“x”不是整数,被忽略。
arr.indexOf(4,2)//从索引是2的地方开始找,返回3,如果找不到就返回-1

兼容ie6-ie8:

if(Array.prototype.indexOf!="function"){
    Array.protype.indexOf=function(searchElement,Formindex){
    var index=-1;
    Formindex=1*formindex||0;//排除传入的索引为非整数。
    for(var k=0;k<this.length;k++){
        if(this.[k]==searchElemnt&&k>Formindex){
            index==k;
            break;//break结束整个循环,continue结束本次循环。
        }
    }
    return index;
    }
}

七、lastIndexOf,同indexOf一样。

arr.lastIndexOf(searchElement,Formindex);
从数组的末端开始找,Formindex默认为arr.length-1,依次递减

兼容ie6-ie8

if(Array.protorype.lastIndexOF!="function"){
    Array.prototype.lastIndexOf=function(searchElement,Formindex){
        var index=-1;
        Formindex=1*Formindex||this.length-1;
        for(var k=this.length-1;k>0;k--){
            if(k<Formindex&&this[k]==searchElement){
                index==k;
                break;
            }
        }
        return index;
    }
}

五、reduce 递归

array.reduce(callback[, initialValue])

callback函数接受4个参数:之前值、当前值、索引值以及数组本身。initialValue参数可选,表示初始值。若指定,则当作最初使用的previous值;如果缺省,则使用数组的第一个元素作为previous初始值,同时current往后排一位,相比有initialValue值少一次迭代。

var sum = [1, 2, 3, 4].reduce(function (previous, current, index, array) {
  return previous + current;
});

console.log(sum); // 10
  • 因为initialValue不存在,因此一开始的previous值等于数组的第一个元素。
  • 从而current值在第一次调用的时候就是2.
  • 最后两个参数为索引值index以及数组本身array.
// 初始设置
previous = initialValue = 1, current = 2

// 第一次迭代
previous = (1 + 2) =  3, current = 3

// 第二次迭代
previous = (3 + 3) =  6, current = 4

// 第三次迭代
previous = (6 + 4) =  10, current = undefined (退出)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值