zoukankan      html  css  js  c++  java
  • javascript高级知识分析——灵活的参数

    代码信息来自于http://ejohn.org/apps/learn/。

    使用数量可变的参数对编程很有好处

    function merge(root){ 
        for(i = 0 ; i < arguments.length; i++)
            for(var key in arguments[i])
                return root[key] = arguments[i][key]
    } 
     
    var merged = merge({name: "John"}, {city: "Boston"}); 
    console.log( merged.name == "John", "name属性和原来一样." ); 
    console.log( merged.city == "Boston", "city属性被复制到了第一个参数对象里" );

    采用这个方法可以设置数量位置不固定的参数,它的思路就是用访问二维数组的方法访问所有对象,将所有的内容复制到第一个对象。

    这里要注意,传进来的所有参数存在于arguments对象中,而函数的形参,依次对应传进来的参数。像本题,arguments包括{name: "John"},{city: "Boston"};而root是{name: "John"}。

    如何构建找到数组当中最大/最小数字的函数?

    function smallest(array){ 
      return Math.min.apply( Math, array ); 
    } 
    function largest(array){ 
      return Math.max.apply( Math, array ); 
    } 
    console.log(smallest([0, 1, 2, 3]) == 0, "找到最小值的位置"); 
    console.log(largest([0, 1, 2, 3]) == 3, "找到最大值的位置");

    另一种方法

    function smallest(){ 
      return Math.min.apply( Math, arguments ); 
    } 
    function largest(){ 
      return Math.max.apply( Math, arguments ); 
    } 
    console.log(smallest(0, 1, 2, 3) == 0, "找到最小值的位置"); 
    console.log(largest(0, 1, 2, 3) == 3, "找到最大值的位置");

    这段代码哪里出的错?

    function highest(){ 
      return arguments.sort(function(a,b){ 
        return b - a; 
      }); 
    } 
    console.log(highest(1, 1, 2, 3)[0] == 3, "获取最高值"); 
    console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "查看数组第二个元素");

    sort是数组对象的方法。

    习题:有没有什么内置方法可以帮助来转化类数组对象为数组对象?

    // 提示: 数组拥有返回新数组的.slice和.splice方法. 
    function highest(){ 
      return makeArray(arguments).sort(function(a,b){ 
        return b - a; 
      }); 
    } 
     
    function makeArray(array){ 
      // 补足代码
    } 
     
    // 期望: [3,2,1,1] 
    console.log(highest(1, 1, 2, 3)[0] == 3, "获取最大值"); 
    // 期望: [5,4,3,3,2,1] 
    console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "验证结果");

    我们可以使用好用的内置方法

    function highest(){ 
      return makeArray(arguments).sort(function(a,b){ 
        return b - a; 
      }); 
    } 
    function makeArray(array){ 
      return Array().slice.call(array);
    } 
     
    console.log(highest(1, 1, 2, 3)[0] == 3, "获取最大值"); 
    console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "验证结果");

    这里是类数组和数组的转化方法,通过call,修改上下文,调用slice实现。

    习题:实现一个乘法函数(第一个参数,和剩余参数的最大值)

    function multiMax(multi){ 
      // 获取一个没有第一个参数的数组 
      var allButFirst = ___; 
     
      // 在剩余的参数数组中找到最大的数字
      var largestAllButFirst = ___; 
     
      return multi * largestAllButFirst; 
    } 
    console.log( multiMax(3, 1, 2, 3) == 9, "3*3=9 (第一个参数, 剩余参数的最大值)" );

    使用call和apply可以很好解决这个问题

    function multiMax(multi){ 
      // 获取一个没有第一个参数的数组 
      var allButFirst = Array().slice.call(arguments,1); 
      // 在剩余的参数数组中找到最大的数字
      var largestAllButFirst = Math.max.apply(Math,allButFirst); 
     
      return multi * largestAllButFirst; 
    } 
    console.log( multiMax(3, 1, 2, 3) == 9, "3*3=9 (第一个参数, 剩余参数的最大值)" );
  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/winderby/p/4064928.html
Copyright © 2011-2022 走看看