zoukankan      html  css  js  c++  java
  • apply的使用技巧

    1.什么是apply?他和call有什么区别?

    apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
     
    Function.apply(obj,args)方法能接收两个参数
    obj:这个对象将代替Function类里this对象
    args:这是一个数组或者类数组对象,它将作为参数传给Function
     
    call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。
     
    Function.call(obj,[param1[,param2[,…[,paramN]]]])
    obj:这个对象将代替Function类里this对象
    params:这个是一个参数列表

    2.什么情况下用apply,什么情况下用call?
    在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用的时候参数的列表是对应一致的就可以采用 apply , 如果参数列表不是数组就可以用call来实现了,call可以直接指定参数列表对应值的位置。

    3.apply的巧妙应用

    一般在目标函数需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地将数组转化为参数列表形式

    (a)比如:取一个数组的最大值

    // Math.max()的参数不支持数组,这时可以使用apply就可实现支持数组参数了。
    Math.max(param1,param2,param3…)
    
    // 使用apply劫持,利用apply的参数将数组转换为参数列表,从而实现在数组中找到最大值
    Math.max.apply(null, Array)

    同理也可以找到数组中的最小值:

    Math.min.apply(null, Array)

    (b)用 apply 将数组添加到另一个数组

    // push接受可变数量的参数,我们也可以一次推送多个元素。但是不能直接推送一个数组,
    concat确实具有我们想要的行为,但它实际上并不附加到现有数组,而是创建并返回一个新数组。
    var arr1 = ['a', 'b']; var arr2= [0, 1, 2]; arr1.push.apply(arr1, arr2); console.info(arr1); // ["a", "b", 0, 1, 2]

    4.参考

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

  • 相关阅读:
    Docker
    Oracle-----RAC重启步骤 RAC管理(crs_stat、crsctl、srvctl)
    kubernetes 设备插件
    golang signal.Notify 信号,如何优雅的退出
    golang 通过fsnotify监控文件
    Golang中基础的命令行模块urfave/cli的用法说明
    fatal: unable to access 'xxx': Encountered end of file
    client-go 和 golang 源码中的技巧
    Golang之wait.Until 简单测试用例
    go viper 库
  • 原文地址:https://www.cnblogs.com/codebook/p/10471849.html
Copyright © 2011-2022 走看看