JavaScript函数中的arguments对象
ECMAScript标准中,每个函数都有一个特殊的内置对象arguments。arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本。
一、内置特性
说它是一个内置对象是因为我们在创建函数时并没有定义这个对象:
var funcTest =function(args){
console.log(arguments); //{‘a’}
}
funcTest(‘a’);
console.log(funcTest.arguments);
直接调用funcTest.arguments输出的结果是null,这一点更可以说明arguments的内置性,当函数开始执行时才能调用到该对象。
二、arguments保存的是函数的实参副本
在声明一个函数时,函数内部会开辟内存空间用以存储形式参数的变量(指针),这一过程是在定义函数时完成的;而arguments是依据传入的实参而开辟内存空间用以存储实参副本,这一过程是在调用函数时发生的。两者并没有在同一内存空间中存储变量的值。
1,当实参数量等于形参数量时,两者中的值是同步的:
function funcTest(a,b)
{
alert(a); //1
alert(arguments[0]); //1
a='11’;
alert(a); //11
alert(arguments[0]); //11
arguments[0]='22’;
alert(a) //22
}
funcTest(‘1’,'2’);
2,有时它们的值并不同步:
function funcTest(a,b,c)
{
alert(arguments[0]); //1
alert(c); //undefined
c=’3’;
alert(arguments[2]); //undefined
}
funcTest(‘1’,'2’);
arguments对象根据传入的实参顺序来与实参的值进行同步,如果该顺序(index)中没有传入实参则不同步。
3,仅仅是保存实参的副本:
function funcTest(a,b)
{
alert(arguments[2]) //undefined
arguments[2]=”1”;
alert(arguments[2]); //undefined
}
funcTest(‘1’,’2’);
在使用arguments对象时, 在函数内部并不能通过使用arguments[n]的形式来开辟新的内存空间用以保存变量的值,也不能通过该方法增加arguments中的变量数。arguments在函数被调用后即开辟内存空间,该空间数目依据实参数量而来,不可更改。
三、arguments的属性
1,length属性
arguments.length返回对象中存储的变量的长度
2,callee 方法
arguments.callee返回函数自身的引用
var funcTest=function(){
alert(funcTest===arguments.callee); //true
}
arguments.callee指向函数自身的引用,这在使用匿名函数时会比较有用。
我们可以利用arguments.callee来创建一个递归函数:
function funcTest(n){
if(n<=1){
return 1;
}else{
return n*arguments.callee(--n);
}
}
也可以用来判断参数数目:
function funcTest(a,b){
if(arguments.length!=arguments.callee.length){
alert(‘传入的参数数目不足!’);
}
}
四、将arguments对象转换成数组(Array)
开篇语里提到arguments对象是一个类数组对象,是因为它有一些特性和数组很相似,比如有length的属性和类似数组的索引器访问内部变量的特性。但实际上它并不是一个真正的数组。我们可以通过下面的方式将它转换成一个真正的数组:
var arr=Array.prototype.slice.call(arguments);
最新文章
- virtual memory exhausted: Cannot allocate memory
- [Android Pro] 常用的android工具类和库
- TypeScript 自动编译
- openfire xmpp 登录参数解析
- php导出excel封装类
- String字符串
- super
- Git的常用命令的使用方法和解释
- php编译安装参数说明
- 一个处理Date与String的工具类
- vector中删除第k个元素的巧妙方法
- 外网访问内网SpringBoot
- Python图像处理之图片文字识别(OCR)
- 最近关于mysql的造型,binlog使用,以及阿里云上线数据处理错误导致被处罚的思考
- ON 子句和 WHERE 子句的不同
- Informatica_(1)安装
- hdu 1754(基础线段树) I Hate It
- a label can only be part of statement and a declaratioin is not a statement
- android 内部存储 安装apk
- LeetCode 84. Largest Rectangle in Histogram 单调栈应用
热门文章
- Cobalt Strike之HTA木马
- 『现学现忘』Docker基础 — 31、实现MySQL同步数据
- AVRmega16&#160;LED&#160;例程
- 题解P0006:生日蛋糕(P1731)
- kafka消费组创建和删除原理
- 用TLS/SSL保证EMQ的网络传输安全
- eclipse开发工具之“指定Maven仓库和setting.xml文件位置”
- servlet中的ServletConfig对象
- 【论文简读】 Deep web data extraction based on visual
- 何使用派生类指针指向基类,即downcast向下转型?