在 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';
}

ECMAScript 2015引入的默认参数值

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);
}