为何Promise.prototype.then允许省略reject函数且支持末尾逗号?
为什么
Promise.then带尾随逗号的调用不会报错? 最近在MDN的Promise相关文章里看到这样的代码:
.then((url) => fetch(url) .then((res) => res.json()) .then((data) => { listOfIngredients.push(data); }), // 注意这里的尾随逗号 )
简化后等价于:
.then(successFunc,);
甚至下面这段代码也能正常运行,不会报错:
const speakPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve("success"); }, 500); }); speakPromise.then(function (data) { console.log(data, " End code"); }, ); // 注意这里的尾随逗号
原因解析
这是因为JavaScript从ES2017开始支持函数参数列表末尾的尾随逗号,不管是普通函数调用、方法调用,还是函数定义时的参数列表,都允许这种写法。
对于Promise.then()方法来说,它接受两个可选参数:第一个是Promise成功时的回调函数,第二个是Promise失败时的回调函数。当你在第二个参数位置只写了一个尾随逗号时,这个位置会被解析为undefined,而then方法本身允许第二个参数缺省(或者传undefined)——此时Promise被拒绝时不会触发任何自定义的失败回调,程序会继续正常执行,不会抛出语法错误。
这种尾随逗号的设计主要是为了方便代码维护:比如在添加新参数时,不需要修改上一行的代码(避免漏加逗号导致的语法错误),同时也让版本控制系统的变更记录更清晰。
内容的提问来源于stack exchange,提问作者user31782
相关产品推荐
相关产品推荐

