ES6 中的函数默认值与 rest 参数的使用技巧
在 ES6 中,函数默认值和 rest 参数是两个比较常用的特性。他们可以帮助我们更方便地编写代码并提高代码的可读性。下面我们就来详细讲一下这两个特性的使用技巧。
函数默认值
ES6 之前定义函数参数默认值的方法是:
function foo(x, y) { x = x || 0; y = y || 0; return x + y; }
但是这种方式有一个弊端,当参数的值为 falsy 值时(比如 0、''、NaN、null、undefined),函数参数的默认值就不起作用了。例如:
foo(0, 5); // 5,而不是 0 + 5
ES6 提供了一种更简单、更可靠且更易读的方式来定义函数参数默认值,例如:
function foo(x = 0, y = 0) { return x + y; }
使用这种方式定义函数参数默认值,即使参数的值为 falsy 值,也可以正确地使用默认值。例如:
foo(0, 5); // 5
当然,函数参数默认值的设置还可以是一个表达式,例如:
function add(x, y = x) { return x + y; }
这里的默认值 y 是 x,这样调用时,如果传入 y 的值是 undefined,就会使用 x 的值作为 y 的默认值。例如:
add(1); // 2 add(1, 2); // 3
还可以使用函数作为默认值,例如:
function add(x, y = (() => x)()) { return x + y; }
这里的默认值是一个立即执行的函数,返回值是 x,这样在调用时可以动态生成默认值,例如:
let x = 1; add(1); // 2
当然,在不考虑浏览器兼容性的情况下,你还可以使用 Nullish Coalescing 运算符(??)来定义函数默认值,例如:
function foo(x, y) { x = x ?? 0; y = y ?? 0; return x + y; }
这样就可以使用 ?? 运算符来判断参数是否为 null 或 undefined,如果是,就使用默认值。
Rest 参数
Rest 参数用于将多个参数合并成一个参数。在函数签名中,它表示一个不定参数(即,可以传入任意数量的参数),并将参数封装成一个数组。例如:
function sum(...args) { return args.reduce((total, current) => total + current, 0); }
在调用这个函数时可以传入任意数量的参数,这些参数会以数组的形式封装到 args 中,并进行求和操作:
sum(1, 2, 3); // 6 sum(1, 2, 3, 4); // 10
Rest 参数还可以与普通的参数一起使用,例如:
function sum(x, y, ...args) { return x + y + args.reduce((total, current) => total + current, 0); } sum(1, 2, 3, 4); // 10 sum(1, 2, 3, 4, 5); // 15
在这个例子中,Rest 参数 args 收集了除第一个参数和第二个参数以外的所有参数,然后进行求和操作。
当然,在不考虑浏览器兼容性的情况下,还可以使用扩展运算符(...)来展开数组,从而将多个参数展开成一个参数,例如:
function sum(x, y, z) { return x + y + z; } let numbers = [1, 2, 3]; sum(...numbers); // 6
这样就可以不使用 Rest 参数,直接将数组展开成函数的参数列表。
总结
函数默认值和 rest 参数是 ES6 中非常实用且常用的特性,可以帮助我们更方便地编写代码并提高代码的可读性。默认值的使用可以让代码更加简洁且可读性更高,而 Rest 参数的使用则可以让代码更具有扩展性和灵活性。同时,这两个特性还可以和其他的特性(比如箭头函数、解构赋值等)一起结合使用,从而产生更强大和方便的语言特性,因此在学习和掌握 ES6 语言特性时,这两个特性是必须要掌握的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64635034968c7c53b0454d0f