属性
一、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
属性。例如,它没有pop
、forEach
、map
方法。但是它可以被转换为一个真正的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
**实例,也就是说你能够在它上面直接使用所有的数组方法,比如sort
,map
,forEach
或pop
。 -
**
arguments
**对象还有一些附加的属性 (如callee
属性)。
5.2 Function.length VS arguments.length
-
arguments.length
表示函数被调用时实际传参的个数 -
Function.length
表示函数形参个数,且仅包括第一个具有默认值之前的参数个数。