函数默认值是一个很提高鲁棒性的东西(就是让程序更健壮)
MDN关于函数默认参数的描述:函数默认参数允许在没有值或undefined被传入时使用默认形参。
ES5
使用逻辑或||来实现
众所周知,在ES5版本中,并没有提供的直接方法供我们我们处理函数默认值
所以只能够自己去增强函数的功能,一般会这么来做:
function doSomething (name, age) { name = name || 'default name' age = age || 18 console.log(name, age)}
我们将函数的两个参数name与age进行默认值的处理,如果没有则使用默认值。
在执行一下函数后,好像并没有什么不对:
doSomething() // default name, 18doSomething('Niko') // Niko , 18doSomething(, 12) // default name, 12
然而当我们执行这样的代码时,就会获得一些超出预期的结果:
doSomething('Niko', 0) // Niko, 18
能够发现,对于参数0,我们上边的默认参数实现方法是有问题的
就像下边的四个表达式,都会输出wrong,这很显然不能够满足上边MDN关于函数默认参数的定义:
console.log(0 || 'wrong')console.log('' || 'wrong')console.log(null || 'wrong')console.log(false || 'wrong')
正确的姿势
所以,在ES5中正确的默认值处理应该是这样:
function doSomething (name, age) { if (name === undefined) { name = 'default name' } if (age === undefined) { age = 18 } console.log(name, age)}
使用三元运算符简化操作
或者我们简写成三元运算符形式的:
function doSomething (name, age) { name = name === undefined ? 'default name' : name age = age === undefined ? 18 : age console.log(name, age)}
使用函数进行封装
但是如果我们每写一个函数,都要重复的去做这些操作
未免太麻烦了,所以,我们对这个逻辑进行一个简单的封装:
function defaultValue (val, defaultVal) { return val === undefined ? defaultVal : val}function doSomething (name, age) { name = defaultValue(name, 'default name') age = defaultValue(age , 18) console.log(name, age)}
这样就很简洁的在ES5实现了函数默认参数的逻辑
one momre things
关于上边的defaultValue函数实现方法,我们在合理的使用弱类型语言的优势后
可以使用这种方式来省去三元运算符的操作:
function defaultValue () { return arguments[+(arguments[0] === undefined)]}
我们知道,arguments表示函数所有的实参
我们使用arguments[0]获取第一个实参,然后与undefined进行全等比较
在外层将表达式的结果转换为Number,然后将这个值作为下标获取arguments中对应的参数。
新闻热点
疑难解答
图片精选