JavaScript中Array.prototype.map调用多传逗号分隔参数为何语法合法?
问题原因解析
这种写法合法、执行结果无差异的核心原因可以分为语法规则和Array.prototype.map的API设计两层:
- 语法层面:尾逗号、多余实参都是JS原生支持的合法写法
首先 ES2017(ES8)正式纳入了函数参数/调用列表尾逗号支持:参数列表最后一位参数后额外加的逗号不会触发语法错误,这个特性是为了方便开发者增删参数、调整顺序时,不需要额外修改前一行末尾的逗号,降低不必要的语法报错概率,你第一个示例中map调用末尾的逗号就属于合法的尾逗号。
其次 JavaScript 从设计之初就允许函数调用的实参数量和函数定义的形参数量不匹配:传入实参少于形参时,未匹配的形参会被赋值为undefined;传入实参多于形参时,多余的实参会被自动忽略,不会触发语法报错。你第二个示例中额外传入的3、4、5、6就属于多余实参,语法层面完全合法。
我们可以用简单的自定义函数验证这个特性:function test(a, b) { return a + b } // 以下调用全部合法,返回结果都是3 test(1, 2,) test(1, 2, 3, 4, 5) - API层面:
Array.prototype.map只会处理前两个传入的参数
根据规范,Array.prototype.map仅接受两个参数:第一个是必填的遍历回调函数,第二个是可选的、指定回调执行时this指向的参数。你示例中不管是仅传入回调加尾逗号,还是额外多传其他参数,map方法本身都只会读取前两个参数,多余的参数不会对map的执行逻辑产生任何影响,所以两次调用返回的结果完全一致。
内容的提问来源于stack exchange,提问作者Sevan Golnazarian
相关产品推荐
相关产品推荐

