zoukankan      html  css  js  c++  java
  • Arguments Optional

    今天碰到了一个题目,哎哟我的哥真是阴吹时听,同时这个题目告诉了我们一些关于JavaScript函数非常一颗赛艇的事

    题目

    创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。

    例如,add(2, 3) 应该返回 5,而 add(2) 应该返回一个 function。

    调用这个有一个参数的返回的 function,返回求和的结果:

    var sumTwoAnd = add(2);

    sumTwoAnd(3) 返回 5

    如果两个参数都不是有效的数字,则返回 undefined。

     

    一脸懵逼是不是?先让我们看一下测试用例:

    add(2, 3) 应该返回 5。
    add(2)(3) 应该返回 5。
    add("http://bit.ly/IqT6zt") 应该返回 undefined。
    add(2, "3") 应该返回 undefined。
    add(2)([3]) 应该返回 undefined。           

    思路
    相信有很多人跟我差不多走了一条全是图钉的弯路,就是纠结如果传入的只是一个数值变量咋办?见测试用例,并没有咋拌这一种拌法。在大局来说,传入参数的个数只有两种。传入一个和传入两个。所以,我们首先将两种类型区分开,并且判断传入的参数是否为数字类型,判断传入参数的个数可以使用我们前面刚说过的arguments。如果拥有非数字类型的不予返回值,默认为undefined
    if (arguments.length === 1 && typeof arguments[0] === 'number') {
      //一个 }
    else if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {
      //两个 }
    既然理清楚了重中之重的区分参数传入值,那就开始写传入参数个数不同的内部逻辑了。
    反派通常死于话多,所以直接动手写代码,先把传入一个参数的业务逻辑写好:
        if (arguments.length === 1 && typeof arguments[0] === 'number') {
            var x = arguments[0];
            return function(y) {
                if (typeof y === 'number') {
                    return x + y;
                }
            };
        }

    传入两个参数的业务逻辑更是简单,只要判断两个参数均为数字类型然后将他们相加即可:

     if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') { return arguments[0] + arguments[1]; } 

    如果不为数字类型的直接跳过让原变量保持undefined就好。

    总体来说并不难,但是如果钻了一个错误方向的牛角尖这个题的复杂程度就会阶乘上升。警戒一下自己以后要从大局上面看问题,插入后如下:
    1 function add() {
    2     if (arguments.length === 1 && typeof arguments[0] === 'number') {
    3         var x = arguments[0];
    4         return function(y) {
    5             if (typeof y === 'number') return x + y;
    6         };
    7     } else if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number')
    8         return arguments[0] + arguments[1];
    9 }
    对技术保持热情与虔诚,生活将会无比伟大
  • 相关阅读:
    CodeSmith快速向导
    生活忠告
    MSF 组队模型
    Javascript 全面理解 caller,callee,call,apply
    Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)
    经典问题:向setTimeout传递函数参数
    [转]JavaScript面向对象的特性
    数据库设计的体会
    Geomedia性能
    关于在SVG中如何实现gif动画的问题?
  • 原文地址:https://www.cnblogs.com/XhhDream/p/5855009.html
Copyright © 2011-2022 走看看