JavaScript中arguments对象的使用方法

arguments对象

    arguments对象对应于传递给函数的参数,我们可以使用arguments对象在函数内部引用函数的参数。此对象中包含了传递给函数的每个参数的条目,与数组的方法类似,arguments中每个条目对应一个索引,索引从0开始,同样的,它也有类似于数组的length属性。以下例子说明了arguments的特性。

function f(arr){
	console.log(arguments);            //控制台输出:[[Array[4],5,6]
	console.log(arguments[0]);         //控制台输出:[1,2,3,4]
	console.log(arguments.length);     // 控制台输出:3
}
f([1,2,3,4],5,6);

    上面的例子中,我们定义了一个空函数,实际调用函数时,传递的参数量比它显式声明的参数量更多的时候,这种情况下,我们可以用到arguments对象。通过arguments[index]获得传递的参数,通过Function.length属性来获得实际参数的数量。我们可以发现,以上特性和数组十分类似。

    但是我们要注意的是arguments对象是所有函数都具有的一个局部变量,也就是说它的作用域就是它所在的函数内部,如果不注意这一点,我们在编程过程中很可能遇到问题。下一个例子是我实际编程中遇到的一个问题,犯错误的原因就是忽略了arguments是一个函数内局部变量的事实。

function destroyer(arr) {
  //实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
  for(var i=1;i<arguments.length;i++){
    var arr = arr.filter(function(x){  //使用filter()方法过滤掉待摧毁的值
    	return x != arguments[i];})    //当x不等于待摧毁的值的时候不返回
  }
  return arr;
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));  //控制台输出[1,2,3,1,2,3],并没有输出正确答案[1,1],filter没有起到作用

    出现问题的原因正是filter()中的arguments[i]。我们可以在这里加一个console.log()来看一下此时的arguments[i]是否还是我所认为的参数值。

function destroyer(arr) {
  for(var i=1;i<arguments.length;i++){
    var arr = arr.filter(function(x){
    	console.log(arguments);       
    	return x != arguments[i];})
  }
  return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

此时控制台的输出如下:

[1, 0, Array[6]]
[2, 1, Array[6]]
[3, 2, Array[6]]
[1, 3, Array[6]]
[2, 4, Array[6]]
[3, 5, Array[6]]
[1, 0, Array[6]]
[2, 1, Array[6]]
[3, 2, Array[6]]
[1, 3, Array[6]]
[2, 4, Array[6]]
[3, 5, Array[6]]

此时的arguments是filter()中函数的局部变量,因而它指向传递给此函数的参数值,也就是我们传递给destroy函数的数组中的6个值。

第一次循环时,i=1,当x=1时,arguments[1]=0;当x=2时,arguments[1]=1;……;所有的情况都符合x != arguments[i]的条件,因而filter()函数根本没起到作用。下面是我改过之后的正确代码。

function destroyer(arr) {
  // Remove all the values
  for(var i=1;i<arguments.length;i++){
  	//console.log(arguments[i]);
  	var elem = arguments[i];
    var arr = arr.filter(function(x){
    	//console.log(arguments);
    	//console.log(arguments[i]);
    	return x != elem;})
    console.log(arr);     //控制台输出:[1,3,1,3],[1,1]
  }
  return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

对象除了.length属性,arguments还有其他两个属性,分别是.callee和.caller,分别用来指向当前执行的函数和调用当前函数的函数,具体用法不在这里详述,等遇到实际问题再进行总结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值