实参个数大于形参个数
对于如下函数
function say(name, msg) {
console.log(name);
console.log(msg);
}
这句话的调用结果是什么?
say('1', '2', '3')
对于其他语言,比如 Java,要是这么写的话,编译器根本就不会让你编译通过,但是在 JS 里是可以运行的。运行结果是
1
2
undefined
实参个数小于形参个数
还是同样的代码
function say(name, msg) {
console.log(name + msg);
}
say('1')
打印
1
undefined
如果什么参数都不写,直接调用
say();
打印
undefined
undefined
结论
从上面的例子可以看出,在 JS 中变量定义的时候,如果不给一个变量赋初值那么该变量的类型为
undefiend
在进行函数调用的时候,不管实参的数目大于形参还是小于形参被调用的函数都会执行;在JS中函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。发生函数调用的时候可以给一个实参也可以给多个实参。
原理
在 js 中,参数在内部是用一个数组来表示。函数接收到的始终是这个数组,而不关心数组中包含哪些参数,如果这个数组不包含任何参数也无所谓,包含多个参数也没问题。
在函数体内可以通过 arguments
对象来访问这个参数数组,从而获取传递给参数的每个参数。
function say(name, msg) {
for(let i = 0; i < arguments.length; i++) {
console.log('arg[' + i + '] = ' + arguments[i]);
}
console.log('length = ' + arguments.length);
}
传入 3 个参数
say('1', '2', '3');
打印结果
arg[0] = 1
arg[1] = 2
arg[2] = 3
length = 3