1.函数默认值
function add(a,b=3){
return a+b;
}
add(1,2);//3
add(1);//4
理解起来也很简单,就是在函数定义的时候设置一个默认值,当调用函数没有传参时,可以根据默认值为其匹配一个参数值
这样子的好处嘛,可以避免在调用时没有传参导致函数报错,同时对于阅读代码也更加直观了,代码量也更少了,嘻嘻
- 直观是因为我们只需要看函数就知道该参数是否可选
- 代码更少是因为在ES6以前,函数不能设置默认值,如果在调用的时候没有传参进去,
那么需要进行是否传递该参数进来,没有的话就取一个默认值才能达到实现的效果
function add(a,b){
if(b==undefined){
b=3;
}
return a+b;
}
add(1);//4
add(1,2);//3
但记得注意一下几点:
1.若使用了函数默认值,则函数所有参数等同于在函数内默认声明过了,所以不能使用let和const定义同名参数
//函数会报错
function add(a,b=3){
const a = 1;
let b = 2;
return a+b;
}
记得var定义同名参数是可以的,这是由于var是定义的全局变量,懂函数作用域链的应该都挺容易理解的
2.若使用函数默认值,则参数不能出现同名参数(ES6以前同名函数是允许的,因为只需要考虑调用时参数传递顺序即可)
//这种不报错
function add(a,a,b){
. . .
}
//报错了
function add(a,a,b=3){
. . .
}
3.函数默认值是惰性求值的,他不是直接传参数值进去的,而是当调用时没有参数时计算默认值再赋值给,所以参数的默认值可以是一个表达式
let x = 100
function add(a,b=x+1){
return a+b;
}
add(1);//101
add(1,2);//3
4.关于函数默认值的位置(你品你细品),你就会发现,上边例子中完全没有在第一个参数写上默认值(实际上只是偷懒只写一个例子┗( ▔, ▔ )┛)
如果默认值,设置在参数a的话,那么可以在调用时是可以不传第一个参数吗?
答案是:No!一般函数默认值写在最后一个参数或者下一个参数仍设置默认值(直接所有参数都写了默认值就不用考虑,哈哈),对于那种跳过式的如
function(a=3,b){} ; function(a,b=3,c){}
像上述情况,默认值前面的参数,调用时不能直接省略掉,因为函数参数读取是按顺序的(#皿#)
所以遇到这种情况,请放弃这种写法(开玩笑的啦,哈哈!!!∑(゚Д゚ノ)ノ)
在调用的时候使用undefined(不能使用null,null代表传进去参数的值为null),代表该参数不传参进去,就会使用默认值了
function add(a=3,b){
return a+b;
}
add(1);//NaN,此时b为undefined,所以相加为NaN
add(,1);//报错
add(undefined,1)://4,正确操作
add(null,1);//1,a就为空值,就是0了呗
函数的length属性
一个用来显示函数中没有设置函数默认值的参数个数,很好理解,
例如
(function(a){. . . }).length;//1
(function(a=1){. . . }).length;//0
(function(a,b){. . . }).length;//2
(function(a,b=1){. . . }).length;//1
看了上面的例子是不是都明白了呀,嘻嘻
但是有一个需要的点,那就是当函数默认值设置在参数中间的时候,length只会统计到第一个默认值前面没有设置默认值的参数的个数
(function(a,b=1){. . . }).length;//1
(function(a=1,b){. . . }).length;//0
(function(a,b=1,c,d=1){. . . }).length;//1