在 ECMAScript 2015 之前,语言层面并不支持函数默认值,一般都是函数内部自己处理,比较常见的做法是使用或逻辑运算符
function leftpad(str, len, char) {
len = len || 2;
char = char || '0';
}
或运算符是一个短路运算符,当前面的值是真值时,返回前面的值;当前面的值是徦值时,返回后面的值,在参数默认值这个场景下,对于假值或运算符是有问题的。
JavaScript 中的徦值包括:空字符串, 0, undefined, null
,对于参数默认值来说,当值为undefined
返回默认值是正确的行为,空字符串,0 和 null 都会被错误的返回默认值。
undefined || 1; // 1
null || 1; // 1
0 || 1; // 1
'' || 1; // 1
更好的做法是直接判断undefined
,前面介绍过需要使用typeof
判断undefined
。
function leftpad(str, len, char) {
len = typeof len === 'undefined' ? len : 2;
char = typeof char === 'undefined' ? char : '0';
}
ES2015引入了原生的参数默认值,极大地简化了语法:
function leftpad(str, len = 2, char = '0') {}
这种方式在函数定义时直接指定默认值,更加直观且避免了之前方法的缺陷。它确保只有在参数未传递或传递undefined
时才使用默认值。
这一变化使得函数更易于阅读和维护,也使得代码更加干净和现代化。开发者可以更容易地理解函数的用途和行为,从而提高代码的可维护性。
对象参数的默认值处理
处理对象参数时,简单的默认参数方法不管用了,解决这个问题有多种办法下面分别介绍下。
第1种,可以使用 ECMAScript 2015 带来的Object.assign
函数,其可以实现将多个对象合并,后面对象的属性可以覆盖前面的属性。
function leftpad(str, opt) {
opt = Object.assign({ len: 2, char: '0' }, opt);
}
第2种,同样的思路还可以使用 ECMAScript 2018 带来的对象解构,类似数组解构方法,解构的语法看起来更简洁。
function leftpad(str, opt) {
opt = { len: 2, char: '0', ...opt };
}
第3种,另一种解构语法,在展开对象时,允许设置默认值,将解构默认值和函数参数结合起来,对于对象属性默认值,推荐使用这种办法。
function leftpad(str, { len = 2, char = '0' }) {
console.log(len, char);
}