是否存在变量赋值/累加及嵌套属性递增的简写或内置函数?
嘿,这两个场景我平时写代码也经常碰到,确实有不少简洁的写法可以替代冗长的判断,我来给你详细说说:
场景1:变量已定义则累加,未定义则直接赋值
这个需求核心是给变量一个兜底的初始值,再执行累加,这里以JavaScript为例(也是这类需求最常见的场景):
最安全的写法(ES2020+ 空值合并运算符):
只会在变量是null或undefined时用兜底值,不会误把0、''、false这些合法的 falsy 值当成“未定义”:// 比如要累加5,未定义时直接设为5 count = (count ?? 0) + 5;更简洁但要注意边界的写法(逻辑或运算符):
如果你的变量不可能是0、''这类 falsy 值,用逻辑或更短,但要警惕误判:count = (count || 0) + 5;可读性拉满的分步写法:
先给未定义的变量设初始值,再累加,一目了然:count ??= 0; // 仅当count为null/undefined时赋值0 count += 5;
场景2:检查嵌套对象属性是否存在,存在则递增
嵌套对象的存在性判断是出了名的冗长,现在原生JS已经有非常简洁的方案了:
方案1:原生可选链+空值合并赋值(推荐,ES2020+)
先逐层确保嵌套对象存在,不存在就初始化,然后直接递增:
// 确保每一层对象都存在,不存在则创建空对象或初始计数对象 obj ??= {}; obj.level1 ??= {}; obj.level1.level2 ??= { count: 0 }; // 直接递增即可,不用再判断 obj.level1.level2.count++;
方案2:更紧凑的单行写法
如果追求代码紧凑,也可以把初始化和递增合并成一行(可读性稍降,但逻辑清晰):
// 若level2不存在则初始化{count:0},然后递增count (obj?.level1?.level2 ??= { count: 0 }).count++;
方案3:工具库简化(可选)
如果项目里已经引入了Lodash这类工具库,可以用它的get和set方法一行搞定:
// 先获取现有值(默认0)加1,再赋值回原路径 _.set(obj, 'level1.level2.count', _.get(obj, 'level1.level2.count', 0) + 1);
内容的提问来源于stack exchange,提问作者Albert Rothman
相关产品推荐
相关产品推荐

