在 JavaScript 的世界里,ECMAScript 是一个被广泛使用的标准。作为前端开发者,我们需要不断地学习新的特性,以跟上时代的步伐。在 ECMAScript 2020 中,可选参数的默认值是一个非常实用的新特性,它使得我们在编写函数时,可以更加优雅地处理参数。
默认参数值的语法
在 ECMAScript 2020 中,我们可以在函数定义时,为参数设置默认值,例如:
function sayHello(name = 'World') { console.log(`Hello, ${name}!`); } sayHello(); // Hello, World! sayHello('ECMAScript 2020'); // Hello, ECMAScript 2020!
在上面的代码中,name
参数的默认值是 'World'
。如果调用 sayHello
函数时不传递参数,它就会打印出 'Hello, World!'
;如果传递了一个字符串参数,它就会打印出 'Hello, ECMAScript 2020!'
。
可以使用默认值的参数位置
在一个函数参数列表中,可以对任意参数设置默认值,并且它们可以位于任何位置:
function concat(str1, str2 = '', str3 = '') { return str1 + str2 + str3; } console.log(concat('Hello', ' ', 'World!')); // Hello World! console.log(concat('Hello', 'World!')); // HelloWorld! console.log(concat('Hello')); // Hello
在上面的代码中,str2
和 str3
两个参数都有默认值,但是它们出现在 str1
的后面。
默认值可以是任何值
设置参数的默认值时,可以使用任何 JavaScript 表达式,例如:
function divide(dividend, divisor = 1) { return dividend / divisor; } console.log(divide(6, 3)); // 2 console.log(divide(6)); // 6
在上面的代码中,divisor
参数的默认值是 1
,它使用了一个简单的表达式。
默认值也可以是函数调用的结果
参数的默认值不仅可以是具体的值,还可以是函数调用的结果:
function getMessage(name, getMessageFunc = () => 'Hello') { return `${getMessageFunc()}, ${name}!`; } console.log(getMessage('ECMAScript 2020')); // Hello, ECMAScript 2020! console.log(getMessage('ECMAScript 2020', () => 'Good morning')); // Good morning, ECMAScript 2020!
在上面的代码中,getMessageFunc
参数的默认值是一个无参数箭头函数,它返回 'Hello'
。
与解构赋值一起使用
在 ECMAScript 2020 中,可以将对象的属性解构为函数的参数,可以与默认值一起使用。例如:
function getName({ firstName = '', lastName = '' } = {}) { return `${firstName} ${lastName}`; } console.log(getName()); // '' console.log(getName({ lastName: 'Doe' })); // ' Doe' console.log(getName({ firstName: 'John', lastName: 'Doe' })); // 'John Doe'
在上面的代码中,getName
函数使用的参数是一个解构对象参数,它还定义了默认值。如果调用时不传递参数或传递了一个空对象,它将返回一个空字符串;如果传递了一个包含首名或姓的对象,它将返回格式化后的名字。
总结
ECMAScript 2020 的可选参数中的默认值是一个非常实用的新特性。它可以让我们在编写函数时,设置默认值,使得我们的代码变得更加优雅易读。在函数参数列表中,可以对任意参数设置默认值,并且它们可以位于任何位置。默认值可以是任何值,包括函数调用的结果。当与解构赋值一起使用时,可以使函数的参数更加清晰易懂。我们建议开发者在编写函数时,充分利用这个特性,以提高代码的可读性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65912f40eb4cecbf2d668c1f