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 }
时间: 2024-12-19 12:23:32

Arguments Optional的相关文章

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

python学习笔记-day03 (函数和文件操作)

函数(代码块,按功能划分(也可按其他方式划分)) 内置函数第三方函数自定义函数 内置函数:help()dir()type()reload()id() vars()  # 获取脚本中的变量,当前模块的所有变量    {'__name__': '__main__',  #被执行的脚本,__name__ 的值为__main__    '__builtins__': <module '__builtin__' (built-in)>,     '__file__': '/PYthon/test/tes

02 Python 起步 - 《Python 核心编程》

?? 介绍 ?? 输入/输出 ?? 注释 ?? 操作符 ?? 变量与赋值 ?? Python 类型 ?? 缩进 ?? 循环与条件 ?? 文件 ?? 错误 ?? 函数 ?? 类 ?? 模块 2.3 注释 普通注释 和大部分脚本及Unix-shell 语言一样,Python 也使用 # 符号标示注释,从 # 开始,直到一行结束的内容都是注释.     >>> # one comment         ... print 'Hello World!' # another comment  

【先定一个小目标】Asp.net Core 在IIS上的托管运行

1.安装 .NET Core Framework 下载.net core地址:官网地址 2.Install IIS 在控制面板->程序与功能->Internet Infomation Services 3.站点部署 实例: https://github.com/aspnet/mvc 在IIS管理器,新建站点->物理路径Path:为项目的根目录. 网站绑定: 在host文件中添加127.0.0.1 mvcsanbox.cn,刷新dns缓存:cmd->ipconfig /flushdn

2015/8/18 Python基本使用(2)

关于判断和循环语句 Python的判断和循环语句非常直观,读起来很接近自然语言. 判断语句if标准的if语句是如下结构: if expression: if_suite 如果expression的表达式非0或者为True,那么if_suite代码块被执行.否则执行下一条语句.同时,Python的条件语句还有else语句. if expression: if_suite else: else_suite 以及elif(else_if)语句 if expression1: if_suite elif

python第一弹快速入门

快速入门:1.python的print语句,与子付款格式操作符(%)结合使用,可实现字符串替换功能. print "%s is number %d" % ("python",1) %s表示一个字符串来替换:%d表示由一个整型来替换:%f表示由一个浮点型来替换: 2.python语句也支持将输出到重定向到文件.符号>>用来定向输出.>>> import sys>>> log = open('/tmp/myprint.lo

Visual C#每一次新版本的变化

What's New in Visual C# .NET 2003[Visual Studio .NET 2003] What's New in Visual C# 2005 What's New in Visual C# 2008 What's New in Visual C# 2010 What's New for Visual C# in Visual Studio 2012 What's New for Visual C# 2015 === =======================

python命令行解释器 argparse

一: argparse介绍 1.  argparse argparse,它是Python标准库中推荐使用的编写命令行程序的工具 parser = argparse.ArgumentParser()  创建一个实例,#parser.parse_args()    parse_args方法是从命令行的参数中返回了一些默认或指定的参数信息.#print dir(parser)parser.add_argument('square',help=' **2 ',type = int)  添加一个posit

Matlab 进阶学习记录

最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal  =  proposal_config('image_means', model.mean_image, 'feat_stride', model.feat_stride); function conf = proposal_config(varargin) % conf = proposal_config(varargin) % ------------------