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);//4add(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);//101add(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了呗
原文地址:https://www.cnblogs.com/kongbaifeiye/p/12601778.html