函数参数的确定
ECMAScript中函数的参数在内部使用一个数组来表示的。函数接收到的始终是这个数组,而不关心数组中有多少个参数或者参数的类型是什么。
function fn(name,age,sex){
console.log(name);
console.log(age);
console.log(sex);
}
fn('xiao',23,'nv'); // xiao 23 nv
console.log('---------------')
fn(23,'nv'); // 23 nv
console.log('---------------')
fn('nv','xiaoqi',23,45);
需要注意的是:形参和实参是一一对应的。
arguments的作用:arguments是类数组
。
- 在函数体内可以通过
arguments
对象来访问这个参数数组,从而获取传递给函数的每一个参数。 - arguments具有使用
[]语法
访问每一个元素的方法,可以使用arguments[0]
来获取第一个参数值,以此类推。
function fn(){
console.log('hello' + arguments[0] + ',' + arguments[1]);
}
fn('nihao',23)
以上代码等同于
function fn(name,age){
console.log('hello' + name + ',' + age);
}
fn('nihao',23)
从以上实例可以得出:JS函数中命名的参数只是提供便利,但不是必需的。
- 可以通过访问arguments对象的
length
属性确定多少个参数传递给了函数。
function fn(){
console.log(arguments.length);
}
fn('xiaoqi',23,'nv'); // arguments.length = 3
fn(23); // arguments.length = 1
fn(); //arguments.length = 0
- 利用
arguments.length
,可以实现接受任意个参数分别实现不同的功能。
arguments对象的长度是由传入的参数个数决定的,不是由定义函数时命名的参数个数决定。
function fn(){
if(arguments.length == 1){
console.log('2个参数');
}else if(arguments.length == 3){
console.log('这是三个参数')
}else{
console.log('000');
}
}
fn('xiaoqi',23,'nv'); // 这是三个参数
fn(23); // 2个参数
fn(); //000
- arguments对象可以和命名参数一起使用
function fn(num1,num2){
console.log(arguments[0] + num2); // 30
}
fn(10,20);
- arguments的值永远与对应命名参数的值保持同步。
function fn(num1,num2){
arguments[1] = 10;
console.log(arguments[0] + num2); // 20
}
fn(10,20);
以上代码解析:每次执行fn()这个函数,num2的值都会被修改为10 ,因为arguments对象中的值会自动反映到num2,但是,num2和arguments[1]的内存空间是不同的。如果fn()只传入了一个参数,那么修改arguments[1]是没有任何效果的,因为arguments的长度已经被确定为1了,没有第二个参数。
- 没有传递值的参数将自动赋值为undefined。
function fn(num1,num2){
console.log(arguments[0]); // undefined
}
fn();
严格模式标准:
- 如果像上列,在函数内设置arguments[1] = 10,那么num2的值为undefined。
ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。
网友评论