理解Javascript参数中的arguments对象
ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载。
Javascript中arguments的存在可以弥补javascript中函数没有重载的不足。
Javascript中函数中的参数是以数组的形式保存的,所以在JavaScript中调用函数给函数传递的参数时,不会受到我们定义函数时设置的参数个数的限制。也就是说如果我们给一个函数定义了2个参数,我们传递的时候可以不传,可以传一个,也可以传两个,传三个...都可以,不会受函数参数个数的影响。arguments类似一个数组(但是不是真正的Array对象),同样可以像数组一样用方括号来访问它的每一个值,并用arguments.length来判断参数的个数。
应该说我们可以向ECMAScript(javascript是对ECMAScript标准的实现)函数任意的传递参数,并可以通过arguments对象来访问这些参数。
arguments的使用:
function myfun() {
console.log(arguments.length);
}
myfun("1","2");//2
myfun("1");//1
myfun();//0
function myfun(num1,num2) {
if(arguments.length === 1){
console.log(arguments[0]);
} else if(arguments.length === 2) {
console.log(arguments[0]+arguments[1]);
} else if(arguments.length === 3) {
console.log(num1+num2+arguments[2]);
}else {
console.log(arguments[0]+" "+num1);
}
}
myfun(1);//1
myfun(1,2);//3
myfun(1,2,3);//6
myfun();//undefined undefined
命名参数可以和arguments一起使用
和其他oo语言不一样,在ECMAScript中,所有参数传递的都是值,不可能通过引用传递参数(毕竟arguments中保存的都是参数的值)。
arguments对象中还定义了callee属性,用来引用当前正在执行的函数,例如在递归中使用:
function factorial(num) {
if(num <=1 ) {
return 1;
} else {
return num*arguments.callee(num-1);
}
}
console.log(factorial(5));//120
需要注意的是如果一个函数的参数有3个,传递的实参只有2个,那么arguments[2]和第三个参数是不共享的.
function foo(x, y, z) {
// 声明的函数参数数量arguments (x, y, z)
console.log(foo.length); // 3
// 真正传进来的参数个数(only x, y)
console.log(arguments.length); // 2
// 参数的callee是函数自身
console.log(arguments.callee === foo); // true
// 参数共享
console.log(x === arguments[0]); // true
console.log(x); // 10
arguments[0] = 20;
console.log(x); // 20
x = 30;
console.log(arguments[0]); // 30
// 不过,没有传进来的参数z,和参数的第3个索引值是不共享的
z = 40;
console.log(arguments[2]); // undefined
arguments[2] = 50;
console.log(z); // 40
}
foo(10, 20);
理解Javascript参数中的arguments对象的更多相关文章
- JavaScript函数中的arguments对象
ECMAScript标准中,每个函数都有一个特殊的内置对象arguments.arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本. 一.内置特性 说它是一个内置 ...
- 函数中的 arguments 对象
JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学 ...
- 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?
JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...
- js中的arguments对象
在Javascript中没有函数重载,而arguments对象弥补了这点不足. js函数的参数是一个数组,在参数个数不固定的情况下,只需要给方法传递不同元素个数的数组即可.即使声明函数时没有形式参数, ...
- JavaScript教程——函数(arguments 对象)
arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...
- javascript中的arguments对象
在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量. 1.什么是arguments? 这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的 ...
- JavaScript中通过arguments对象实现对象的重载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于javascript闭包中的this对象
我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...
- 关于 js中的arguments 对象
arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推.这个对象只有在函数体内部,才可以使用. var f = fu ...
随机推荐
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 数据库报错
-- 查询mysql 数据库链接空闲时间持有最大空闲时间,单位为秒 SHOW VARIABLES WHERE VAriable_name = 'interactive_timeout'; -- 会出现 ...
- 简明python教程 --C++程序员的视角(八):标准库
os模块 这个模块包含普遍的操作系统功能. 如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.一个例子就是使用os.sep可以取代操作系统特定的路径分割符. os.system() 执行li ...
- 设置viewport进行缩放
<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no"& ...
- het smooth 组装高杂合度二倍体基因组前期数据处理
http://sourceforge.net/projects/het-smooth/ equencing technologies, such as Illumina sequencing, pro ...
- 用Rprofile文件配置打开时R的设置
R中经常会使用一些命令,而且需要重复输入,非常麻烦.如果能够一打开R就直接使用会方便很多. 通过配置一个.Rprofile文件,可以达到我们的目的. 注:本文仅适用于Mac # 创建一个.Rprofi ...
- CGI实现页面的动态生成
传统的Web应用开发局限于有限的静态页面(HTML静态页面),不利于系统的扩展,不能提供及时信息,而且修改维护麻烦,所以建立一个动态Web应用程序尤为重要.一方面根据访问者的不同请求返回不同的访问信息 ...
- int除以int 得到double类型值
double serviceability =(double)(count1+count2)/sum; 需要进行强转 除数 这样得到的值就是double类型了
- Codeforces Round #310 (Div. 2) A B C
A. Case of the Zeros and Ones time limit per test 1 second memory limit per test 256 megabytes input ...
- Javascript模块化编程(三):require.js的用法【转】
作者: 阮一峰 日期: 2012年11月 7日 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js ...
- Linux1.0源代码编译过程
根据源代码包中的readme文件及http://chfj007.blog.163.com/blog/static/173145044201191195856806/?suggestedreading& ...