• JS中some(),every(),forEach(),map(),filter()区别


    JS在1.6中为Array新增了几个方法map(),filter(),some(),every(),forEach(),也就是一共有这么多方法了。

    刚开始接触这些倒也记得不是很清楚,在此纪录一下以加深影响。我主要从两个角度来理解和记忆吧,一个是API的使用,一个是内部实现。

    函数简述

    map():返回一个新的Array,每个元素为调用func的结果

    filter():返回一个符合func条件的元素数组

    some():返回一个boolean,判断是否有元素是否符合func条件

    every():返回一个boolean,判断每个元素是否符合func条件

    forEach():没有返回值,只是针对每个元素调用func

    API的区别

    function my_func(item) {
      if (item == 1) {
        console.log('t');
        return true;
      }
      console.log('f');
      return false;
    }
    
    // init an array
    l = [0,1,2,3,4]
    
    // print: f,t,f,f,f
    // return:[false, true, false, false, false]
    l.map(my_func)
    
    
    // print: f,t,f,f,f
    // return: 1
    l.filter(my_func)
    
    // print: f,t
    // return: true
    l.some(my_func)
    
    // print: f
    // return: false
    l.every(my_func)
    
    // print: f,t,f,f,f
    //return: undefined
    l.forEach(my_func)
    内部实现
    
    // From:http://developer.mozilla.org
    
    Array.prototype.map = function(fun /*, thisp*/)
    {
      var len = this.length;
      if (typeof fun != "function")
        throw new TypeError();
    
      var res = new Array(len);
      var thisp = arguments[1];
      for (var i = 0; i < len; i++)
      {
        if (i in this)
          res[i] = fun.call(thisp, this[i], i, this);
      }
    
      return res;
    };
    
    Array.prototype.filter = function(fun /*, thisp*/)
    {
      var len = this.length;
      if (typeof fun != "function")
        throw new TypeError();
    
      var res = new Array();
      var thisp = arguments[1];
      for (var i = 0; i < len; i++)
      {
        if (i in this)
        {
          var val = this[i]; // in case fun mutates this
          if (fun.call(thisp, val, i, this))
            res.push(val);
        }
      }
    
      return res;
    };
    
    Array.prototype.some = function(fun /*, thisp*/)
    {
      var len = this.length;
      if (typeof fun != "function")
        throw new TypeError();
    
      var thisp = arguments[1];
      for (var i = 0; i < len; i++)
      {
        if (i in this && fun.call(thisp, this[i], i, this))
          return true;
      }
    
      return false;
    };
    
    Array.prototype.every = function(fun /*, thisp*/)
    {
      var len = this.length;
      if (typeof fun != "function")
        throw new TypeError();
    
      var thisp = arguments[1];
      for (var i = 0; i < len; i++)
      {
        if (i in this && !fun.call(thisp, this[i], i, this))
        return false;
      }
    
      return true;
    };
    
    Array.prototype.forEach = function(fun /*, thisp*/)
    {
      var len = this.length;
      if (typeof fun != "function")
        throw new TypeError();
    
      var thisp = arguments[1];
      for (var i = 0; i < len; i++)
      {
        if (i in this)
          fun.call(thisp, this[i], i, this);
      }
    };
  • 相关阅读:
    C#程序调试
    jsp连接sql数据库
    SQL记录
    对于和/的小问题:证明路径中可以混合使用斜杠和反斜杠
    集合初识
    details.jsp页面的 response.addCookie(cookie);报错&tomcat高版本下的Cookie问题
    sql查询操作—顺序查询
    myeclipse使用Microsoft JDBC Driver 6.0 for SQL Server连接sql
    JavaScript、Java、C#关于for循环的比较
    关于jsp动作元素的一点疑惑
  • 原文地址:https://www.cnblogs.com/cosyer/p/7646925.html
Copyright © 2020-2023  润新知