• apply的理解和数组降维


    func.apply(thisObj, [argArray] );

    apply方法用来改变函数执行时的this指向,后面的参数是一个类数组对象,可以是数组,arguments,甚至一个有length属性的对象 { length: 3 }

    apply有一个重要的作用,就是可以将  数组参数  转换为  参数列表,也就是可以 对一个数组应用原本只支持参数列表的函数。

    例如:

    Math.max(param1, param2....)
    
    Array.prototype.push(param1, param2...)
    
    Array.prototype.concat(param1, param2...)

    这些只支持参数列表的函数,不能直接传入数组,但是通过apply方法,就可以将一个数组传进去,得到该数组作为参数的结果。

    //apply传入null,则转换为全局对象,window或global
    Math.max.apply(null, arr)  <=>   global.max(arr[0], arr[1], arr[2] .....)  
    
    //这里的null只是占位,传入任何值都行,max和min函数中this不起作用,传个123,结果也一样
    Math.min.apply(null, arr)  <=>   global.min(arr[0], arr[1], arr[2] ......) 
    
    //注意concat后面的arr2不是以整体的形式去连接,而是以打碎的形式去连接
    Array.prototype.concat(arr1, arr2) <=>  arr1.concat(arr2[0], arr2[1], arr2[3] ......) 
    
    Array.prototype.push(arr1, arr2)   <=>  arr1.push(arr2[0], arr2[1], arr2[3] ......)

    总之,apply就是将后面的数组参数打碎传入函数调用。 

    下面是一个经典的利用apply对数组降维的例子:

    Array.prototype.concat.apply([], arr2d)

    一个空数组,apply调用concat,将后面的二维数组打碎,concat本身又将一维数组打碎,连接成一个一维数组。

    过程如下:

    Array.prototype.concat.apply([], arr2d) <=>  [].concat(arr2d[0],arr2d[1],arr2d[2]...)
    //arr2d[0],arr2d[1],arr2d[2]...本身也是数组,会被concat再次打碎,合并进前面的空数组,这样
    //经过两次打碎,一个二维数组就降维成一个一维数组                                             
  • 相关阅读:
    MyBatis(十):MyBatis懒加载 延迟加载详解
    MyBatis(九):MyBatis类型处理器(TypeHandler)详解
    MyBatis(八):MyBatis插件机制详解
    MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)
    MyBatis(六):MyBatis复杂映射
    内省概念及详解(MethodDescriptor、PropertyDescriptor)
    反射概念及详解
    sublime3 + chrome + xdebug调试php代码
    php的文件系统和程序执行函数整理
    php编程趣事:乘法口诀、百钱买百鸡、过桥等问题
  • 原文地址:https://www.cnblogs.com/mengff/p/9770143.html
Copyright © 2020-2023  润新知