建议14:灵活使用Arguments
Javascript支持Arguments机制.Arguments是一个为数组,可以通过数组下标形式获取该集合中传递给函数的参数值.例如:下面函数中,没有指定形参,但在函数体内通过Arguments对象可以获取传递给该函数的每个参数值.
function f(){
for(var i = 0;i<arguments.length;i++){
console.log(arguments[i]);
}
}
f(1,3,6) //1 3 6
Arguments对象仅能够在函数体内使用,它仅作为函数体的一个私有成员而存在,因此可以通过点号运算符来指定Arguments对象所属的函数.由于Arguments对象在函数体内是唯一和可指向的,因此一般会省略前置路径,直接引用对象的调用标识符arguments.
通过数组的形式来引用Arguments对象包含的实参值,如arguments[i],其中arguments表示对Arguments对象的实际引用,变量i是 Arguments对象集合的下标值,从0开始,知道arguments,length(其中length是Arguments对象的一个属性,表示Arguments对象包含的实参的个数).
由于Arguments不是Array的实例,因此不饿能够直接调用数组的方法,但是能够通过call或apply方法间接实现.
下面把循环变量的值传给Arguments对象元素,以实现动态改变实参的值
function f(){
for(var i = 0;i<arguments.length;i++){
arguments[i] = i
console.log(arguments[i]);
}
}
f(2,3,6) // 0 1 2 而不是 2 3 6
通过修改Arguments对象的length属性值,可以达到改变函数实参个数的目的.当length属性值增大时,增加的实参值为undefined,当length属性值减小时,则会丢弃arguments数据集合后面对应个数的元素.
Arguments在实际开发中具有重要的价值,使用它可以检测用户在调用函数时所传递的参数是否符合要求,增强函数的容错能力,同时还可以开发出很多功能强大的函数.
如果要定义的函数参数个数不确定,或者参数个数很多,又不想为每个参数都定义一个变量,此时定义函数可以保留参水列表为空,在函数内部使用Arguments对象来访问调用函数时传递的所有参数.下面这个实力就是利用Arguments对象来计算函数任意多个参数的平均值
function avg(){
var num = 0, l = 0;
for(var i = 0;i<arguments.length;i++){
if(typeof arguments[i] != 'number')
continue;
num+= arguments[i]
l++
}
console.log(l);
num /= l
return num
}
console.log(avg(1,2,3,4)); //2.5
console.log(avg(1,2,3,"4")); //
Arguments对象包含一个callee属性,它能够返回当前Arguments对象所属的函数引用,这相当于在函数体内调用函数自身.在匿名函数中,callee属性比较有用,通过它在函数内部引用函数自身.
下面实例中,通过arguments.callee获取对当前匿名函数的引用,然后通过函数的length属性确定他的形参个数.最后哦,通过实参和形参数目的比较来确定传递的参数是否合法
function f(x,y,z){
var a = arguments.length;
var b = arguments.callee.length
if(a!=b){
throw new Error("传递的参数不匹配");
}else{
return x+y+z;
}
}
console.log(f(3,4,5)); //
console.log(f(2,3)); //Uncaught Error: 传递的参数不匹配
Function对象的length属性返回的是函数的形参个数,而Arguments对象的length属性返回的是函数的实参个数.如果函数不是匿名函数,则arguments.callee等价于函数名.
建议14:灵活使用Arguments的更多相关文章
- 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝
建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后, ...
- 改善Java程序的151个建议(1-4)
1.不要在常量和变量中出现易混淆的数字 个人感觉这条在于编程命名的规范性.代码除了给机器看,也要给人看.要写能够结构清晰,命名规范,让人看懂的代码. 字母l作为长整型标志时务必大写 L 2.莫让常量蜕 ...
- 编写高质量代码改善C#程序的157个建议读书笔记【11-20】
章节索引 建议11:区别对待 == 和Equals 建议12:重写Equals也要重写GetHashCode 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dyna ...
- 《编写高质量代码:改善C#程序的157个建议》源码下载
==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...
- 编写高质量代码改善C#程序的157个建议
1.使用StringBuilder或者使用string.Format("{0}{1}{2}{3}", a, b, c, d)拼接字符串. 2.使用默认转型方法,比如使用类型内置的P ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Java编写高质量代码改善程序的151个建议
第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...
- java开发150个建议
阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法 建议 ...
- 给大家一些改善 Python 程序的 91 个建议
读了一本还不错的书「编写高质量代码改善 Python 程序的 91 个建议」,大多数的建议是真心不错,我虽然写python也有3年多了,但是有些地方确实没去注意过,特地整理了一下,给大家参考. 我已经 ...
随机推荐
- 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲
Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...
- springdatajpa 认识以及使用方式
1.spingdatajpa是什么? Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架(即上述的:JPA的实现产品),可使开发者用极简 ...
- Widgets学习
ListView ListView RecyclerView RecyclerView ExpandableListView 关闭箭头 elvMsg.setGroupIndicator(null); ...
- unittest(6)- 作业- 测试类中写多个函数
实践作业:对多个接口发起请求,测试类中写多个测试函数 # 1. http_request import requests class HttpRequest: def http_request(sel ...
- tomcat——nginx负载均衡
Tomcat一般应用在这种小型系统中应用非常广泛,是开发调试jsp的首先应用.Tomcat和其他web软甲一样具有解析HTML语言的功能,但是处理效率远不及Apacge和Nginx,所以Tomcat一 ...
- Event Handling Guide for iOS(五)
基本概念: 加速计: 又称加速度计,测量设备运动的加速度. 加速度: 矢量,描绘速度的方向和大小变化的快慢. 陀螺仪: 感测与维持方向的装置. 原文: Motion Event声明: 由于本人水平有限 ...
- 8——PHP循环结构&&条件结构
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Logstash实践
转载请注明出处:https://www.cnblogs.com/shining5/p/9542710.html Logstash简介 一个开源的数据收集引擎,具有实时数据传输能力,可以统一过滤来自不同 ...
- PyCharm+git+码云实现project版本控制
1.安装git https://git-scm.com/downloads 2.PyCharm中配置 3.申请码云 4.PyCharm中安装码云插件 右键选择,重启Pycharm. 重新打开PyCha ...
- 20170813-CSRF 跨站请求伪造
CSRF CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造. 跨站:顾名思义,就是从一个网站到另一个网站. 请求:即HTTP请求. 伪造:在这里可以理解为 ...