跳到主要内容

属性

一、name


function.name 属性返回函数实例的名称。

二、caller


function.caller 返回调用指定函数的函数.

三、length


**length**属性指明函数的形参个数。形参的数量不包括剩余参数个数,仅包括第一个具有默认值之前的参数个数。

形参没有默认值
function foo(a,b,c,d,e,f,g){
}
console.log(foo.length); // 结果为 7 (一共有 7 个形参)
形参具有默认值
function foo(a,b,c,d,e=20,f,g){
}
console.log(foo.length); // 结果为 4 (Function.length 仅包括第一个具有默认值之前的参数个数。)

四、arguments


4.1 认识

arguments 是一个对应于传递给函数的参数的类数组对象。

4.2 语法

function foo(argu1,argu2,argu3,argu4){
console.log(arguments); // Arguments(4) [10, 20, 30, 40, callee: ƒ, Symbol(Symbol.iterator): ƒ]
}
foo(10,20,30,40);

4.3 操作

获取参数

function foo(argu1,argu2,argu3,argu4){
console.log(...arguments);
}
foo(10,20,30,40);

获取参数长度

function foo(argu1,argu2,argu3,argu4){
console.log(arguments.length);
}
foo(10,20,30,40);

根据索引值获取某个参数

function foo(argu1,argu2,argu3,argu4){
console.log(arguments[2]);
}
foo(10,20,30,40);

获取argument当前所在的函数

function foo(argu1,argu2,argu3,argu4){
console.log(arguments.callee);
}
foo(10,20,30,40);

因此,如果在一个函数里出现argument.callee(),会发生递归

function foo(argu1,argu2,argu3,argu4){
arguments.callee();
}
foo(10,20,30,40);

4.4 深入理解

  • typeof arguments结果为object

    function foo(argu1,argu2,argu3,argu4){
    console.log(typeof arguments); // 结果为 object
    }
    foo(10,20,30,40);
  • Array.isArray(arguments)结果为false

    function foo(argu1,argu2,argu3,argu4){
    console.log(Array.isArray(arguments)); // 结果为 false
    }
    foo(10,20,30,40);
  • arguments对象不是一个Array。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 popforEachmap 方法。但是它可以被转换为一个真正的Array

    • 通过slice()转化为数组

      function foo(argu1,argu2,argu3,argu4){
      const array = Array.prototype.slice.call(arguments);
      console.log(array); // 结果为 [10, 20, 30, 40]
      }

      // 或者

      function foo(argu1,argu2,argu3,argu4){
      const array = [].slice.call(arguments);
      console.log(array); // 结果为 [10, 20, 30, 40]
      }
      foo(10,20,30,40);
    • 通过Array.form()转化为数组

      function foo(argu1,argu2,argu3,argu4){
      const array = Array.from(arguments);
      console.log(array); // [10, 20, 30, 40]
      }
      foo(10,20,30,40);
    • 通过扩展运算符...转化为数组

      function foo(argu1,argu2,argu3,argu4){
      const array = [...arguments];
      console.log(array); // [10, 20, 30, 40]
      }
      foo(10,20,30,40);

五、问题


5.1 剩余参数 Vs arguments

剩余参数arguments 对象之间的区别主要有三个:

  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参

  • **arguments**对象不是一个真正的数组,而剩余参数是真正的 **Array**实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sortmapforEachpop

  • **arguments**对象还有一些附加的属性 (如callee属性)。

5.2 Function.length VS arguments.length

  • arguments.length 表示函数被调用时实际传参的个数

  • Function.length 表示函数形参个数,且仅包括第一个具有默认值之前的参数个数。