为何在函数参数中同时使用扩展运算符和解构赋值?
关于
...[param]参数写法的用途 这种写法是剩余参数语法结合数组解构的组合用法,本质是把所有传入的参数收集成一个数组,再通过数组解构提取第一个元素赋值给param,多余的参数会被直接忽略。它和普通单个参数写法的差异及用途主要有这些:
1. 明确表达只关心第一个参数的意图
当调用函数时传入多个参数,普通写法foo(bar)里bar会取第一个参数,但剩余参数仍会留在arguments对象中;而foo(...[bar])同样取第一个参数赋值给bar,写法本身就能明确传达代码只处理第一个参数、其余参数无需关注的语义,比普通写法的表意更清晰。
2. 改变函数的length属性
函数的length属性统计的是形参列表中非剩余参数的数量:
- 普通写法
function foo(bar) {}的foo.length为1 - 而
function foo(...[bar]) {}的foo.length为0,因为剩余参数不会被计入length统计
在一些框架或库的函数签名检测场景中,可能要求函数的length为0,这种写法就能满足这类特殊需求。
3. 类构造器中灵活适配父类参数传递
在子类构造器中,如果父类构造器可能接收多个参数,但子类仅需第一个参数做初始化,同时又需要保留透传所有参数给父类的能力,这种写法可以简化实现:
export class SomeClass extends SomeParent { constructor(...[configuration]) { super(...arguments); // 透传所有参数给父类 this.config = configuration; // 仅使用第一个参数 } }
相比普通的constructor(configuration)写法,它既保留了子类仅处理第一个参数的逻辑,又无需修改形参列表就能灵活完成父类参数透传。
4. 便捷扩展默认值逻辑
当需要为参数设置默认值时,这种解构写法可以更清晰地表达“无论传多少参数,只取第一个,无参数时用默认值”的逻辑:
function foo(...[bar = 'default_val']) { console.log(bar); } foo(); // 输出 'default_val' foo(1, 2); // 输出 1
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

