在 ES6 之前,我们在定义函数时经常需要手动检查参数是否存在,如果不存在则使用默认值。而在 ES6 中,JavaScript 引入了参数默认值的特性,可以更加方便地定义函数,并且可以避免一些常见的错误。
使用默认值
在 ES6 中,我们可以为函数的参数指定默认值。例如,下面的代码定义了一个函数 printMessage
,它有两个参数,message
和 level
,其中 level
参数有一个默认值为 1
:
function printMessage(message, level = 1) { console.log(`[${level}] ${message}`); } printMessage('Hello, world!'); // [1] Hello, world! printMessage('Goodbye, world!', 2); // [2] Goodbye, world!
在上面的例子中,我们调用了 printMessage
函数两次,第一次只传入了 message
参数,第二次传入了 message
和 level
两个参数。由于 level
参数有一个默认值,所以在第一次调用时,它的值为 1
。
默认值的优先级
当函数同时指定了默认值和传入了实参时,实参的值会覆盖默认值。例如,下面的代码定义了一个函数 multiply
,它有两个参数,x
和 y
,其中 y
参数有一个默认值为 1
:
function multiply(x, y = 1) { return x * y; } console.log(multiply(2)); // 2 console.log(multiply(2, 3)); // 6
在上面的例子中,我们调用了 multiply
函数两次,第一次只传入了 x
参数,第二次传入了 x
和 y
两个参数。由于 y
参数有一个默认值,所以在第一次调用时,它的值为 1
,而在第二次调用时,它的值被覆盖为 3
。
默认值的作用域
默认值的作用域与函数体的作用域相同。例如,下面的代码定义了一个函数 increment
,它有两个参数,x
和 y
,其中 y
参数有一个默认值为 x
:
function increment(x, y = x) { return x + y; } console.log(increment(1)); // 2 console.log(increment(1, 2)); // 3
在上面的例子中,我们调用了 increment
函数两次,第一次只传入了 x
参数,第二次传入了 x
和 y
两个参数。由于 y
参数的默认值是 x
,所以在第一次调用时,它的值与 x
相同,都是 1
,而在第二次调用时,它的值被覆盖为 2
。
注意事项
在使用默认值时,需要注意以下几点:
- 默认值只会在函数执行时计算一次。如果默认值是一个对象或数组,那么每次调用函数时都会使用同一个对象或数组。
- 默认值的值可以是任何表达式,包括函数调用、变量引用等。
- 默认值的值可以是前面参数的引用,例如,下面的代码定义了一个函数
f
,它有三个参数,x
、y
和z
,其中z
参数的默认值是x + y
:
function f(x, y, z = x + y) { return x + y + z; } console.log(f(1, 2)); // 6 console.log(f(1, 2, 3)); // 6
总结
ES6 中的参数默认值特性可以方便地定义函数,并且可以避免一些常见的错误。在使用默认值时,需要注意默认值的优先级、作用域以及注意事项,以充分发挥其优势。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65793323d2f5e1655d32ff86