有如下函数:
function write(a,b){ console.log(a,b); }
此函数包涵有两参数,分别是a,b
调用方式如下:
write("girl","boy");
当调用方法,参数不传值时则会打印undefined
如果我们想要不传参数也能打印一个默认值-----“boy”,即让参数有一个默认值。
首先我想到的是用三目运算符和短路运算符逻辑或(||)
方法如下:
function write(a,b){ b=b?b:"boy"; //b=b||"boy" console.log(a,b); }
如此问题解决,让我们来试试
没有问题,再来试试特殊情况空‘ ’
write('girl','')
预期结果:girl
不妙,得到的结果是居然是girl boy。(我不想给girl匹配对象的啊,旁边的空位应该给“我”留着)
算了,还是来分析分析原因吧,我们用的是三目运算符或短路运算符,这二者都是依据布尔值进行判断的,空字符串对应的布尔值是false,故这里b值最终都会被赋值为“body”
好吧,既然如此。再继续想想着。
如果一个函数的参数没有传值,那么这个参数的值就是没有初始化的,那么它就是“undefind”(基本数据类型之一),如此我可以直接判断参数是否传值。改写后的代码如下:
function write(a,b){ if(typeof b==='undefined'){ b='boy' } console.log(a,b); } write('girl',);
继续进行探索下,以上的方法是在es5中被想到的为函数设置默认参数的办法。虽然实现了目的,但这种方法总还是欠缺了些许“优雅”。代码的可阅读性和简洁性都不是太好,在一大段代码中想要一眼找出函数是否带有默认参数还是有点麻烦的。
为函数设置默认参数的做法是较为常用的一种场景,因此ES6中新增了一个特性来解决。在ES6中写带默认参数的函数方式如下:
function write(a,b='boy'){ console.log(a,b); } write('girl',);
这就简洁很多了,这才是优雅的实现。