zoukankan      html  css  js  c++  java
  • Function.apply()在提升程序性能方面的技巧

    我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。

    比如 
    alert(Math.max(5,8))   //8
    alert(Math.max(5,7,9,3,1,6))   //9

    但是在很多情况下,我们需要找出数组中最大的元素。

    var arr=[5,7,9,1]
    alert(Math.max(arr))    // 这样却是不行的。一定要这样写
    
    function getMax(arr){
        var arrLen=arr.length;
        for(var i=0,ret=arr[0];i<arrLen;i++){
            ret=Math.max(ret,arr[i]);       
        }
        return ret;
    }

    这样写麻烦而且低效。如果用 apply呢,看代码:

    function getMax2(arr){
        return Math.max.apply(null,arr);
    }

    两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。

    再比如数组的push方法。
    var arr1=[1,3,4];
    var arr2=[3,4,5];
    如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]
    arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]

    我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)

    var arrLen=arr2.length
    for(var i=0;i<arrLen;i++){
        arr1.push(arr2[i]);
    }

    自从有了Apply,事情就变得如此简单

    Array.prototype.push.apply(arr1,arr2)

      

    *--------------------------------------------------我的分割线--------------------------------------------------*

    我的理解说明:

    1.先说Math.max()

    Math.max(1,2,3,4,5)

    Math.max.apply(null,[1,2,3,4,5]);

    apply方法能把第二个参数(一个数组),把数组中的n个值,作为n个参数,一起传给应用apply的函数方法.

    而这里的null,是因为Math.max函数是一个全局函数.此处不需要改变this指向.

    2.再说arr1.push(arr2)

    push是所有Array的原型方法,当对arr1应用时,this就指向了arr1.所以使用apply时,将第一个参数设置为arr1,第二个参数arr2将会变为n个参数,一并传给push();

    我也可以不用Array.prototype.push,而直接使用: arr1.push.apply(arr1,arr2).也可以达到同样的效果.

  • 相关阅读:
    poj 2155 B
    hdu 1556 A
    hdu 1556 A
    #366 A-C
    最长上升子序列
    Codeforces Div3 #501 A-E(2) F以后补
    字典的建立 查找
    字典序大小
    头文件模板
    01背包模板 及 优化
  • 原文地址:https://www.cnblogs.com/liulangmao/p/3450196.html
Copyright © 2011-2022 走看看