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 (第一个参数, 剩余参数的最大值)" );
  • 相关阅读:
    基于redis的分布式锁实现方案
    nginx 配置文件详解
    Linux 下安装Nginx
    Nginx简介
    Spring Boot 整合 Spring Security 示例实现前后分离权限注解 + JWT 登录认证
    idea2020.1版本下载安装与激活
    Cloud Alibaba --Nacos
    spring Cloud Alibaba 简介
    Eclipse中SVN更改连接用户
    Win7(64bit)搭建SVN
  • 原文地址:https://www.cnblogs.com/winderby/p/4064928.html
Copyright © 2011-2022 走看看