建议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年多了,但是有些地方确实没去注意过,特地整理了一下,给大家参考. 我已经 ...
随机推荐
- 微信发送朋友圈URL JSAPI事件demo
<script> var imgUrl = 'http://m.ximiyu.com/content/images/thumbs/0000126_540.jpeg'; var lineLi ...
- Web窗体--控件
服务器基本控件:button: text属性linkbutton:text属性,它是一个超链接模样的普通buttonhyperlink: navigateurl:链接地址,相当于<a>标签 ...
- Memcached笔记——(四)应对高并发攻击
近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...
- idea运行时默认显示的index.jsp修改方法
在web.xml中加入以下代码,然后重启服务器就可以了. <welcome-file-list> <welcome-file>这儿写你要显示的页面名称</welcome- ...
- java.lang.ClassNotFoundException :xxxxxxx
码的!java.lang.ClassNotFoundException: org.springframework.jdbc.core.RowMapper这个错误搞了半天 因为写的项目是手动建的WEB- ...
- python socket实例
1.客户端向服务端发送 #coding:utf-8 '''客户端''' import socket khd=socket.socket() #声明socket类型,同时生产socket连接对象 khd ...
- C++全排列函数next_permutation()和prev_permutation()
头文件:#include<algorithm> * * * 1. next_permutation(): next_permutation()函数的返回类型是bool类型. 即:如果有一个 ...
- Promethues配置
# my global config global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Defau ...
- openCryptoki安装
什么是OpenCryptoki OpenCryptoki提供Linux下的PKCS#11库和工具,支持包括TPM和IBM加密硬件以及软件令牌. 目前(2019/05/06)最新release版为3.1 ...
- [大餐]开发摘记1--我的Fragment通信的框架
[大餐]开发摘记1--我的Fragment通信的框架 | 卖牙膏的芖口钉 盒子 盒子 博客 分类 标签 友链 大专栏 [大餐]开发摘记1--我的Fragment通信的框架ass="ROUN ...