JavaScript---arguments对象

1.概念

    arguments 是一个对应于传递给函数的参数的类数组对象。主要用途是保存函数参数

2.理解

   arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

function func(a,b,c){
    arguments[0]//对a的引用
    arguments[1]//对b的引用
    arguments[2]//对c的引用
}

 参数也可以被设值:

arguments[1] = 'new value';

arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);

    如果调用的参数多于正式声明接受的参数,则可以使用arguments对象。这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length来确定传递给函数参数的个数,然后使用arguments对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length属性。

PS:arguments 对象只能在函数内使用

3.对对象参数使用typeof 

console.log(typeof arguments);    // 'object'
// arguments 对象只能在函数内使用
function test(a){
    console.log(a,Object.prototype.toString.call(arguments));
    console.log(arguments[0],arguments[1]);
    可以使用索引确定单个参数的类型。    
    console.log(typeof arguments[0]);
}
test(1);
/*
1 "[object Arguments]"
1 undefined
number
*/

4.使用扩展语法

您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:
var args = Array.from(arguments);
var args = [...arguments];

5.属性

    5.1argument.callee

     指向当前执行的函数,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文,这有利于匿名函数的递归或者保证函数的封装性。

     示例:阶乘的运算

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * arguments.callee(num-1);
   } 
}

    PS:不推荐使用arguments.callee

    原因:访问 arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。

    代替方案:

    给内部函数一个名字即可(当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。

function factorial(num){
	return (function func(num){
		if (num <=1) {         
			return 1;     
		} else {
			return num * func(num-1);
		}
	})
}
此参数的使用还可参考:https://blog.csdn.net/u013451157/article/details/78686881

     5.2arguments.caller

    指向调用当前函数的函数。

5.3arguments.length

    指向传递给当前函数的参数数量。

5.4arguments[@@iterator]

    返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。

    注意:现在在严格模式下,arguments对象已与过往不同。arguments[@@iterator]不再与函数的实际形参之间共享,同时caller属性也被移除。

6.示例

    6.1遍历求和

function add() {
    var sum =0,
        len = arguments.length;
    for(var i=0; i<len; i++){
        sum += arguments[i];
    }
    return sum;
}
add()                           // 0
add(1)                          // 1
add(1,2,3,4);                   // 10

更多用法参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments#%E8%AF%AD%E6%B3%95

猜你喜欢

转载自blog.csdn.net/qq_37725650/article/details/79967382
今日推荐