前言
javascript中,函数不介意传递进来多少参数,也不在乎传进来的参数什么数据类型,甚至不传参数。
javascript中的函数定义未指定函数形参的类型,函数调用也不会对传入的实参值做任何类型检查。
同名形参
非严格模式下,函数中可以出现同名形参,只能访问最后出现的该名称的形参。在严格模式下,抛出语法错误。
1 function add(x,x,x){ 2 return x; 3 } 4 console.log(add(1,2,3)); //3
参数个数
实参数大于形参数:
1 function say(name,message){ 2 console.log("hello"+name+message); 3 } 4 say("world","!","byebye"); //helloworld!
实参数小于形参数:
1 function say(name,message){ 2 console.log("hello"+name+message); 3 } 4 say("world!"); //helloworld!undefined
注意:在js中变量定义的时候,如果未给一个变量赋初值那么该变量的类型为undefined。在函数调用时,无论参数个数如何变化函数都会执行,所有在js中函数不介意传递进来多少参数,也不在乎传递进来的参数是什么数据类型。发生函数调用时可以给一个实参也可以给多个实参,因为在js中的参数在内部用一个数组来表示。函数接收到的始终是这个数组,不关心参数个数,在函数内可以通过arguments对象来访问这个参数数组,获取传递给参数的每个参数。arguments对象和数组对象类似,可以通过下标来获取传入的每一个元素;也可以使用length属性来确定传递进来多少个参数。
arguments对象并不是Array的实例,它是一个类数组对象,可使用方括号语法访问它的每个元素
1 function say(name){ 2 console.log(arguments[0],arguments[1]) 3 } 4 say("hello","world"); //hello world
arguments对象的length属性显示实参的个数,函数的length属性显示形参的个数
1 function say(name){ 2 console.log(arguments.length); 3 } 4 say("hello","world"); //2 5 console.log(say.length); //1
形参只是提示便利,但不是必需的
1 function say(){ 2 return arguments[0]+arguments[1]; 3 } 4 console.log(say("hello","world!")) //helloworld!
对象参数
1 function arraycopy(from,form_start,to,to_start,length){ }
通过名/值对的形式传入参数,这样参数的顺序无关紧要了。定义函数的时候,传入的实参都写入一个单独的对象中,调用时传入一个对象,对象中的名/值对是真正需要的实参数据
1 function easycopy(args){ 2 arraycopy(args.from,args.form_start||0,args.to,args.to_start||0,args.length) ; 3 } 4 var a = [1,2,3,4],b=[]; 5 easycopy({form:a,to:b,length:4});
同步
当形参与实参的个数相同时,arguments对象的值和对应形参的值保持同步
1 function test(num1,num2){ 2 console.log(num1,arguments[0]); //1 1 3 arguments[0] = 2; 4 console.log(num1,arguments[0]); //2 2 5 num1 = 10; 6 console.log(num1,arguments[0]); //10 10 7 } 8 test(1);
注:虽然命名参数和对应arguments对象的值相同,但并不是相同的命名空间。它们的命名空间是独立的,但值是同步的
严格模式下,arguments对象的值和形参的值是独立的
1 function test(num1,num2){ 2 "use strict"; 3 console.log(num1,arguments[0]); //1 1 4 arguments[0] = 2; 5 console.log(num1,arguments[0]); //1 2 6 num1 = 10; 7 console.log(num1,arguments[0]); //10 2 8 } 9 test(1)
当形参并没有对应的实参时,arguments对象的值与形参的值并不对应
1 function test(num1,num2){ 2 console.log(num1,arguments[0]); //undefined,undefined 3 num1 = 10; 4 arguments[0] = 5; 5 console.log(num1,arguments[0]); //10 5 6 } 7 test()