arguments

作者: 你喜欢吃青椒吗_c744 | 来源:发表于2019-07-29 23:23 被阅读0次

定义

  • arguments是一个对应于传递给函数的参数的伪数组对象。
  • arguments对象是所有(非箭头)函数中都可用的局部变量。
  • 你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
arguments[0]
arguments[1]
arguments[2]
//参数也可以被设置:
arguments[1] = 'new value';

请注意

  • arguments对象不是一个 Array数组。
  • 它类似于Array,但除了length属性和索引元素之外没有任何Array属性。可以arguments[i]来访问对象中的元素,但它不能用数组的一些方法,例如push,pop,slice等。
  • 如果调用的参数多于正式声明接受的参数,则可以使用arguments对象。
  • 这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length来确定传递给函数参数的个数,然后使用arguments对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length属性。
  • 函数调用的时候,浏览器每次都会传递进两个隐式参数:
    1. 函数的上下文对象this
    2. 封装实参的对象arguments

如何把arguments转化为数组

//es5
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
//es5的新写法。
//因为使用slice会阻止某些JavaScript引擎中的优化
//可以尝试通过遍历arguments对象来构造一个新的数组
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
//es6的两种写法
const args = Array.from(arguments);//第一种
const args = [...arguments];//第二种。扩展运算符

对arguments使用typeof

typeof参数返回 'object'。

console.log(typeof arguments);    // 'undefined'
// 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
*/
//可以使用索引确定单个参数的类型。
console.log(typeof arguments[0]);

属性

  • arguments.callee
    指向当前执行的函数。当函数正在执行时才可调用,可以实现方法的递归调用。
function argTest(a,b,c){
    var e = arguments.callee.toString();
    console.log(e);
}
argTest(); //打印出函数本身
  • arguments.caller
    指向调用当前函数的函数
  • arguments.length
    指向传递给当前函数的参数数量。
    Arguments的length属性,表示function函数实际所传参数的个数
function argTest(a,b,c){
    var t = arguments.length; //实际传参个数
    var e = argTest.length;   //期望传参个数
    console.log(t);
    console.log(e);
}
argTest(11,12);       //t=2,e=3
argTest(11,12,13);    //t=3,e=3
argTest(11,12,13,14); //t=4,e=3
  • arguments[@@iterator]
    返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。
  • arguments的参数访问
    Arguments对象的参数访问可以用arguments[i]来访问函数所传的参数。
function argTest(a,b,c){
    var arg = [];
    for(var i=0;i<arguments.length;i++){
        arg.push(arguments[i]);
    }
    console.log(arg);
}
argTest(11,12);       //[11, 12]
argTest(11,12,13);    //[11, 12, 13]
argTest(11,12,13,14); //[11, 12, 13, 14]

实现递归调用

可以实现匿名函数的递归调用。

//实现一个阶乘函数
function factorial(n){
    if(n == 1){
        return 1;
    }else{
        n * arguments.callee(n-1);
    }
}
factorial(1); //1
factorial(5); //120

参考文章

Arguments 对象

Arguments对象作用深度研究

JS中的arguments参数

相关文章

网友评论

      本文标题:arguments

      本文链接:https://www.haomeiwen.com/subject/yyqwrctx.html