ES2015及后续版本是否支持函数调用时的命名参数?
关于ES中默认参数与命名参数的替代方案
你说得没错,ES2015确实只引入了默认参数,但并没有直接支持像其他语言那样的命名参数调用语法——就是那种可以跳过前面的默认参数,直接指定后面参数值的写法,比如你举的foo(bar = 3)这种。不过后续的ES版本(直到现在)也没加入这个特性,不过我们有几个挺好用的替代方案:
1. 解构赋值优化版对象传参
你提到的传入对象的思路非常实用,现在我们可以用ES2015的解构赋值让这个写法更简洁优雅,直接在函数参数里就处理好默认值:
function foo({ baz = 0, bar = 1 } = {}) { // 直接使用baz和bar即可 console.log(baz, bar); } // 调用时只传需要指定的参数 foo({ bar: 3 }); // 输出 0 3 foo({ baz: 5 }); // 输出 5 1 foo(); // 输出 0 1
这里要注意给解构的对象加个默认值= {},不然直接调用foo()的时候会报错,因为我们没法解构undefined。
2. 集中式默认参数管理(可选)
如果参数比较多,或者需要更灵活的配置管理,也可以结合对象合并来处理:
function foo(options = {}) { const defaultOptions = { baz: 0, bar: 1, qux: 2 }; // 用传入的参数覆盖默认值 const { baz, bar, qux } = { ...defaultOptions, ...options }; console.log(baz, bar, qux); } foo({ bar: 3 }); // 输出 0 3 2
这种方式的好处是默认参数集中在一个对象里,后续修改或者扩展参数会更方便。
另外补充一点:虽然JS本身没有原生命名参数,但像TypeScript这类超集语言提供了类似的语法糖,不过编译后最终还是会转换成对象传参的形式。
内容的提问来源于stack exchange,提问作者Alexey Romanov
相关产品推荐
相关产品推荐

