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);
JavaScript函数中的arguments对象的更多相关文章
- 函数中的 arguments 对象
JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学 ...
- 理解Javascript参数中的arguments对象
ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载. Javascript中arguments的存在可以弥补javascript中函数没有重载的不足. Javascri ...
- javascript函数中的实例对象、类对象、局部变量(局部函数)
定义 function Person(national,age) { this.age = age; //实例对象,每个示例不同 Person.national = national; //类对象,所 ...
- js理论-函数中的Arguments对象
详情参考:https://github.com/mqyqingfeng/Blog/issues/14 如果: arguments和实参的关系,以及arguments的属性 附上代码和注解 functi ...
- 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?
JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...
- Javascript函数的参数arguments
arguments Description 在所有的函数中有一个arguments对象,arguments对象指向函数的参数,arguments object is an Array-like obj ...
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- JavaScript中通过arguments对象实现对象的重载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- minouche
靶机准备 先将靶机导入虚拟机,并将网络模式改为NAT 扫描不到ip,改VirtualBox,使用桥接,并将kali也改为桥接模式 扫描ip:192.168.0.102 netdiscover -r 1 ...
- loj#6072 苹果树(折半搜索,矩阵树定理,容斥)
loj#6072 苹果树(折半搜索,矩阵树定理,容斥) loj 题解时间 $ n \le 40 $ . 无比精确的数字. 很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了 ...
- [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
[bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_ ...
- volatile 变量和 atomic 变量有什么不同?
Volatile 变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不 能保证原子性.例如用 volatile 修饰 count 变量那么 count++ 操作就不是原子 性的. 而 A ...
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...
- 在虚拟机里面安装mysql
https://dev.mysql.com/downloads/repo/yum/ 首先到网站里面下载 mysql80-community-release-el7-3.noarch.rpm 通过xft ...
- Iterator 和 ListIterator 有什么区别?
1.ListIterator 可以在遍历的时候,调用add()添加元素 2.ListIterator提供了更多的一些方法,如previous().hasPrevious() 等
- 遇到过的问题之“解决 No qualifying bean of type 问题”
1.问题 解决 No qualifying bean of type 问题 2.思路: 1 检查是否添加了对应注解 2 检查配置是否正确,扫描包名, 类名及id是否正确 一 . 传统SSM项目 ssm ...
- python学习笔记(一)——Python基础
一.python 基础语法 python 的解释器在启动时会自动加载一个内建的模块,因此我们在使用 print().input()等函数时不用导入其他模块文件. 基本语法: 每条语句结尾没有分号 定义 ...
- 002.MEMS应用在开关电源上,实现大功率超小型化
设计任务书 1.有关MEMS还有待具体了解 2.有关开关电源的目前难题也需要了解