JavaScript表达式中括号的作用是什么?结合reduce代码求解
原代码片段如下:
const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
以下是各个括号的具体作用说明:
1. 箭头函数后 () => (...) 外层括号的作用
这里的圆括号是分组运算符,作用是将括号内的所有逻辑合并为一个完整的表达式,作为箭头函数的返回值。
当箭头函数省略{}函数体时,默认会返回=>后方的第一个表达式结果,加这个括号可以明确告知JS引擎,括号内的全部运算属于同一个返回值表达式,避免语法解析错误。
2. 赋值语句外层 (acc[curr] = obj[curr]) 括号的作用
这里的括号是为了修正运算符优先级:
JS中&&的优先级远高于赋值运算符=,如果不加这层括号,curr in obj && acc[curr] = obj[curr] 会被JS引擎错误解析为:
// 错误逻辑,等号左侧是运算结果,不是可赋值的左值,会抛出语法错误 (curr in obj && acc[curr]) = obj[curr]
加括号后明确告诉JS引擎,整个赋值语句是&&的右操作数,保证赋值逻辑正确执行。
3. (curr in obj && ..., acc) 整体括号包裹的逗号表达式作用
这里的括号包裹的是逗号运算符表达式,逗号运算符的规则是:从左到右依次执行所有子表达式,最终返回最后一个子表达式的结果。
- 首先执行
curr in obj && (acc[curr] = obj[curr])逻辑:只有属性存在时才给累加器赋值 - 不管前面的赋值逻辑是否执行,最终都会返回
acc累加器对象,正好符合Array.reduce的回调函数要求:每次迭代必须返回累加器,供下一次迭代使用。
另外补充说明curr in obj && ...的逻辑:这是JS的短路与运算,等价于简写的if判断,只有curr in obj返回true时,才会执行&&后方的赋值代码,符合只提取对象存在属性的需求。
内容的提问来源于stack exchange,提问作者eakl
相关产品推荐
相关产品推荐

