1. 函数的length属性
length
是函数对象的一个属性值,指该函数有多少个必须要传入的参数,即形参的个数。
形参的数量不包括剩余参数个数,仅包括第一个具有默认值之前的参数个数。
与之对比的是, arguments.length
是函数被调用时实际传参的个数。
demo1:
function foo(a, b=1, c) {
console.log(arguments.length); // 3
// 形参的数量,仅包括第一个具有默认值之前的参数个数
console.log(foo.length); // 1
}
foo(1, 2, 3)
复制代码
demo2:
function foo(a, ...args) {
console.log(arguments.length); // 3
console.log(args); // [ 2, 3 ]
// 形参的数量不包括剩余参数个数
console.log(foo.length); // 1
}
foo(1, 2, 3)
复制代码
注意:rest参数必须在最后面, 否则会报错。
2. arguments和形参的关系
2.1 严格模式下
arguments表示实参类数组对象,它总是能跟着具名形参的变化而变化,相当于和形参存在一种映射关系,改变一个,另一个会自动改变。
function fn(a, b) {
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
a = 10;
b = 20;
// 改变了形参的值,arguments自动更新
console.log(arguments[0]); // 10
console.log(arguments[1]); // 20
arguments[0] = 100;
arguments[1] = 200;
// 改变了arguments的值,形参自动更新
console.log(a); // 100
console.log(b); // 200
}
fn(1, 2)
复制代码
2.2 严格模式
当函数有默认参数写法时,改变a和b的值,不会对arguments对象造成影响,并且不能进入严格模式。
function fn(a, b) {
'use strict';
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
a = 10;
b = 20;
// 改变了形参的值,但不影响arguments
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
arguments[0] = 100;
arguments[1] = 200;
// 改变了arguments的值,但不影响形参
console.log(a); // 10
console.log(b); // 20
}
fn(1, 2)
复制代码
2.3 默认参数的形参和arguments没有关系
当函数的任意一个形参具有默认值时,所有的形参和arguments就不再存在映射关系。并且此时不能进入严格模式,否则会报错。
function fn(a, b=3) {
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
a = 10;
b = 20;
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
arguments[0] = 100;
arguments[1] = 200;
console.log(a); // 10
console.log(b); // 20
}
fn(1, 2)
复制代码
function fn(a, b=3) {
'use strict';
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
a = 10;
b = 20;
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
arguments[0] = 100;
arguments[1] = 200;
console.log(a); // 10
console.log(b); // 20
}
fn(1, 2)
// 报错:
// SyntaxError: Illegal 'use strict' directive in function // with non-simple parameter list
复制代码