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