函数参数有两种:形参和实参。
形参:在定义函数时,把函数括号中的变量名称为形式参数,简称形参或虚拟参数。
实参:在调用函数时,把函数括号中的参数称为实际参数,简称实参。实参可以为常量、变量和表达式。
实参为常量:
function sum(num1,num2){//num1,num2为形参
return num1 + num2;
}
sum(1,2);//1,2为实参;实参为常量
(function (a,b) { //a,b为形参
return a + b;
})(3,4);//3,4为实参;实参为常量
function compare(a,b){
return (a>b?a:b);
}
console.log(compare(5,9));//返回值为9
实参为变量:
function welcom(name){//name为形参
return "hello," + name;
};
let somebody = "Jim";
welcom(somebody);//somebody为实参;实参为变量
实参为表达式:
var a = function(num1,num2){
return num1 + num2;
};
var b = function(x,y){
return x + y;
}
b(a(1,2),2);//返回值为:5;实参a(1,2)为表达式
在实际开发中,经常会出现实参数量少于形参数量的情况,但是在函数内部依然可以使用这些形参,这是因为在定义参数时,已经对它们进行了初始化,并设置了默认值。在调用函数时,如果用户不传递或者少传递参数,则会采用默认值。而形参数量少于实参数量的情况比较少见,这种情况一般发生在参数数量不确定的函数中。
默认参数(ES6的默认参数特性)
function sum(num1,num2 = 5){//num1,num2为形参
return num1 + num2;
}
sum(2);//返回值7;实参num2没有值,使用默认值5
function sum(num1,num2=5){//num1,num2为形参
return num1 + num2;
}
sum(2,3);//返回值5;实参num2有值
形参没有默认值,且实参个数少于形参
function sum(num1,num2){
return num1 + num2;
}
sum(2);//NaN,
上面的sum()函数传入参数比定义参数个数少,此时JS也不会报错,缺少的参数会使用 undefined 代替。例如我们使用sum(2)调用函数。这样num1的值为2,而num2会被设置为undefined,这样结果就是2+undefined,所以返回就是NaN。
如果有必要,可以验证参数是否是undefined,并且提供一个默认值。
function sum(param1,param2){
if(param2 === undefined){
param2 = 2;
}
return param1 + param2;
}
sum(2);//4
这种方式也叫"鸭子类型理论"。但是这种方式,没有上面的通过ES6设置默认参数值更直白明了。
解构参数:
采用ES6解构的方式可以更加直观便捷的为函数传递对象参数
function sayName({ firstName, lastName } = {}) {
console.log( firstName + ' ' + lastName );// 注意这里可以直接访问到两个解构赋值的变量
}
let person = {
firstName: 'Stephen',
lastName: 'Curry'
}
sayName(person); // Stephen Curry
解构参数还可以是默认值:
// 右边的{}是函数参数的默认值,左边的{firstName = 'foo', lastName = 'bar'}是函数的参数,也是变量声明的地方。
// 变量分别有默认值,当不传递任何参数给函数的时候,变量就会使用默认值。
function sayName({ firstName = 'foo', lastName = 'bar'} = {}) {
console.log( firstName + ' ' + lastName );
}
let person = {
wrongFirstName: 'Stephen',
lastName: 'Curry'
}
sayName(person); // foo Curry
箭头函数中,没有自己的 arguments 和this,如果想获取函数的arguments对象就不要使用箭头函数
let sumArgs = (a,b)=>{
return a + b;
console.log(arguments);
}
sumArgs(1,2);//Uncaught ReferenceError: arguments is not defined
剩余参数
剩余参数允许我们将一个不定数量的参数表示为一个数组。
function sumbNumbers(...numbers){
return numbers.reduce(function(sum,every){
return sum += every;
});
}
sumbNumbers(1,1,1);//3