058_JavaScript函数arguments对象

1. 参数规则

1.1. JavaScript函数定义不会为参数(parameter)规定数据类型。

1.2. JavaScript函数不会对所传递的参数(argument)实行类型检查。

1.3. JavaScript函数不会检查所接收参数(argument)的数量。

2. 参数默认

2.1. 如果调用参数时省略了参数(少于被声明的数量), 则丢失的值被设置为: undefined。

2.2. 如果函数调用的参数太多(超过声明), 则可以使用arguments对象来达到这些参数。

3. 函数参数值传递

3.1. 如果函数参数非引用类型, 那么函数改变了参数的值, 它不会改变参数的原始值。

3.2. 参数的改变在函数之外是不可见的。

var a = 100;

function myFunction(a) {
	a -= 99;              
}

myFunction(a); 
document.write('a = ' + a + '<br />'); // 输出a = 100

4. 函数参数引用传递

4.1. 如果函数参数是引用类型, 例如是对象, 如果函数改变了对象属性, 它也改变了原始值。

4.2. 对象属性的改变在函数之外是可见的。

var obj = {b: 'zhangsan'};

function myFunction(obj) {     
	obj.b = 'lisi';  
}

myFunction(obj); 
document.write('b = ' + obj.b + '<br />'); // 输出b = 'lisi'

4.3. 例子

4.3.1. 代码

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8" />
		<title>函数参数值、引用传递</title>
	</head>
	<body>
		<script type="text/javascript">
			var a = 100;
			var obj = {b: 'zhangsan'};

			function myFunction(a, obj) {
				a -= 99;              
				obj.b = 'lisi';  
			}

			myFunction(a, obj); 
			document.write('a = ' + a + '<br />');
			document.write('b = ' + obj.b + '<br />');
		</script>
	</body>
</html>

4.3.2. 效果图

5. arguments对象

5.1. 在函数代码中, 使用特殊对象arguments, 开发者无需明确指出参数名, 就能访问它们。

5.2. 我们可以使用arguments[0]的形式访问函数参数, 即第一个参数的值(第一个参数位于位置0, 第二个参数位于位置1, 依此类推):

// arguments[0]访问第一个参数
document.write('第一个参数: ' + arguments[0] + '<br />'); 
// arguments[1]访问第二个参数
document.write('第二个参数: ' + arguments[1] + '<br />'); 

5.3. 实例

5.3.1. 代码

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8" />
		<title>arguments访问参数值</title>
	</head>
	<body>
		<script type="text/javascript">
			function myFunction(a, b) {
				// arguments[0]访问第一个参数
				document.write('第一个参数: ' + arguments[0] + '<br />'); 
				// arguments[1]访问第二个参数
				document.write('第二个参数: ' + arguments[1] + '<br />'); 
    			return a * b;                
			}

			myFunction(8, 9); 
		</script>
	</body>
</html>

5.3.2. 效果图

6. 检测参数个数

6.1. JavaScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档, 最多可接受255个), 而不会引发任何错误。任何遗漏的参数都会以 undefined传递给函数, 多余的参数将忽略。

6.2. arguments对象的length属性返回函数调用实际参数的个数。

function howManyArgs() {
	// arguments.length返回函数调用实际参数的个数
	document.write('该函数有' + arguments.length + '个参数<br />');             
}

howManyArgs(); 
howManyArgs(8);
howManyArgs(8, 'abc');

6.3. 实例

6.3.1. 代码

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8" />
		<title>arguments length属性</title>
	</head>
	<body>
		<script type="text/javascript">
			function howManyArgs() {
				// arguments.length返回函数调用实际参数的个数
				document.write('该函数有' + arguments.length + '个参数<br />');             
			}

			howManyArgs(); 
			howManyArgs(8);
			howManyArgs(8, 'abc');
		</script>
	</body>
</html>

6.3.2. 效果图

7. 模拟函数重载

7.1. 可以使用arguments对象判断传递给函数的参数个数, 即可模拟函数重载:

function doAdd() {
	document.write('doAdd()<br />');

	var value = 0;
	for(var i = 0, l = arguments.length; i < l; i++){
		value += arguments[i];
	}
	document.write('value = ' + value + '<br />');

	return value;
}

doAdd(); 
doAdd(8); 
doAdd(8, 9);
doAdd(8, 9, 10);

7.2. 实例

7.2.1. 代码

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8" />
		<title>arguments模拟函数重载</title>
	</head>
	<body>
		<script type="text/javascript">
			// 做加法运算的函数
			function doAdd() {
				document.write('doAdd()<br />');

				var value = 0;
				for(var i = 0, l = arguments.length; i < l; i++){
					value += arguments[i];
				}
				document.write('value = ' + value + '<br />');

				return value;
			}

			function doAdd(a, b) {
				document.write('doAdd(a, b) a = ' + a + ', b = ' + b + '<br />');
				
				var value = 0;
				for(var i = 0, l = arguments.length; i < l; i++){
					value += arguments[i];
				}
				document.write('value = ' + value + '<br />');

				return value;
			}

			// 就近原则, 调用doAdd(a, b)
			doAdd(); 
			doAdd(8); 
			doAdd(8, 9);
			doAdd(8, 9, 10);
		</script>
	</body>
</html>

7.2.2. 效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值