js参数与大多其他语言的参数有所不同,js不介意传进来多少个参数,也不在乎传进来的是什么类型。即:你定义只有两个参数的方法,你在调用的时候未必一定要传递两个参数。可以随意 解析器不会报错。
原因:js的参数在内部是用一个数组来表示的,函数接受的时候永远都是这个数组,而不关心数组中包含哪些参数。多少都无所谓。所以js没有重载
argunment[]特点:
- 在函数体中可以使用argumentsf对象来访问这个参数数组。
- arguments对象与数组相似但是不是数组 它可以使用数组的表现形式。arguments[i]
- 参数可以与argument一起使用,也可以互换使用 argument[]的值永远与对应参数名的值保持同步
- argument[]与对应的参数名访问的内存空间不是相同的,它们的内存空间是独立的。
- 单向影响:修改命名参数不会影响aegument[]的所对应的值。
- argument[]对象的长度是由传入参数的个数决定的,不是由定义的参数个数决定的。
- 没有传递值的命名参数将自动被赋予undefined值。例: 形参两个 实参一个。
- 如果传入参数少于命名参数,那命名参数与arguments是不会同步的
<script>
/*测试arguments组*/
function f(a,b,c){
//测试:argument[]对象的长度是由传入参数个数决定的。
console.log( "arguments的长度 = "+arguments.length);
// 测试 没有传递值的命名参数将自动被赋予undefined值。例: 形参两个 实参一个
console.log( "c没有实参 c= "+c);
//测试: argument[]的值永远与对应参数名的值保持同步
console.log("传递来的形参a:a="+a);
arguments[0] = 2;
console.log("arguements[0]改变: a="+a);
a = 3;
console.log("a改变: arguments[0]="+arguments[0]);
a = function fn(){}
console.log("a改变为方法: arguments[0]="+arguments[0]);
//测试:单向影响:修改命名参数不会影响aegument[]的所对应的值。
//待补充 : 不理解这句话 还望赐教
// 测试 :如果传入参数少于命名参数,那命名参数与arguments是不会同步的
console.log("传递来的形参C: c=" +c);
arguments[2]=4;
console.log("c未赋值 arguments[2]改变: arguments[2]="+arguments[2]);
console.log("c未赋值 arguments[2]改变: c="+c);
c = 5;
console.log("c未赋值 c改变: arguments[2] ="+arguments[2]);
}
f(1,1);
</script>
测试结果: