ECMAScript 2021 中的函数参数默认值详解
在 JavaScript 中,函数是非常重要的一部分。而在函数的使用过程中,经常涉及到参数的传递。在 ECMAScript 2021 中,新增了一些关于函数参数的默认值的语法,可以帮助开发者更加方便的使用函数。
- 基本语法
在 ES6 中,我们已经可以为函数的参数设置默认值。比如:
function add(a, b=1) { return a + b; }
这里,我们为参数 b 设置了默认值 1。如果 add 函数被调用时只传入了第一个参数 a,那么 b 将会被默认赋值为 1。
在 ES2021 中,我们可以使用更加简洁的语法:
function add(a, b = 1, c) { return a + b + c; }
这里只有 b 参数设置了默认值,而 a 和 c 参数没有设置默认值。如果我们调用这个函数:
add(2, undefined, 4);
那么 b 将被赋值为默认值 1,函数返回值为 7。
- 可选参数
在 ES6 中,使用默认值设置可选参数。比如:
function greet(name = 'World') { console.log(`Hello ${name}!`); }
这里我们为形参 name 赋予默认值为 'World'。如果我们调用了:
greet();
那么控制台输出 Hello World!
。如果我们调用了:
greet('Alice');
那么控制台输出 Hello Alice!
。
而在 ES2021 中,我们可以更好的实现可选参数。比如:
function greet(name?) { console.log(`Hello ${name ?? 'World'}!`); }
这里我们使用了可选链语法 (? 表示 name 是可选的) 和 nullish coalescing 运算符 (?? 表示如果 name 不存在或者是 null 或 undefined,就返回 'World')。如果我们调用了:
greet(); // 输出 Hello World! greet('Alice'); // 输出 Hello Alice! greet(null); // 输出 Hello World!
通常情况下,可选链 (? 表示调用链中的属性或方法是可选的) 和 nullish coalescing 运算符 (?? 表示如果当前值为 null 或 undefined,返回默认值) 将会结合使用来实现更加强大的功能。
- 其他注意事项
在函数定义时如果给一个参数指定了默认值,那么该参数后面的所有参数都必须指定默认值。
比如下面的代码是不符合规范的:
function makeAdder(a = 0, b) { return a + b; }
这里 a 参数已经指定了默认值,而 b 参数没有指定默认值。这样会导致函数在调用时无法确定参数的值。
在使用函数的默认参数时,我们需要注意以下几点:
- 默认参数可以是任何表达式,如果是函数调用的结果,那么每次调用函数时都会重新计算该表达式;
- 默认参数的作用域遵循普通的变量作用域规则,即在函数内部的参数自成一体,不会影响函数外部的同名变量;
- 默认参数只对 undefined 有作用,对 null, '', 0 等值不起作用。
- 总结
ECMAScript 2021 中的函数参数默认值语法让函数的使用更加方便和灵活。我们可以通过设置默认值、可选参数等方式,更加自由地控制函数的行为。对函数参数默认值的深入了解,对于我们在开发过程中更好地运用函数起到了很大的指导意义。
示例代码:
-- -------------------- ---- ------- -- --- ----- -------- ------ ---- - ------ - - -- - -------------------- -- -- - ------------------ ------------ -- -- - -- ------ ----- -------- ------ - - -- -- - ------ - - - - -- - ------------------ ---------- ---- -- -- - -- --- ------ -------- ---------- - -------- - ------------------ ----------- - -------- -- -- ----- ------ --------------- -- -- ----- ------ -- ------ ------ -------- ------------ - ------------------ ------ -- ------------ - -------- -- -- ----- ------ --------------- -- -- ----- ------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6495a4b148841e98942bf49e