首页 / 资讯中心 / 文章详情

eslint-plugin-unicorn no-useless-compound-assignment:抓出恒等值复合赋值,让死代码无处留存

eslint-plugin-unicorn no-useless-compound-assignment:抓出恒等值复合赋值,让死代码无处留存 ★ FEATURED ARTICLE
eslint-plugin-unicorn no-useless-compound-assignment抓出恒等值复合赋值让死代码无处留存【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorneslint-plugin-unicorn 的 no-useless-compound-assignment 是一条做复合赋值恒等值检测的建议型规则x 0、x * 1这类写法它会直接告诉你这是可以删掉的死代码省掉你逐个审查的成本。下面我们从 5 个维度拆它抓什么、放过什么、为什么拒绝自动修复、修复怎么双轨以及边界压力测试。规则速写检测范围是一张写死的「运算符 → 恒等值」映射表rules/no-useless-compound-assignment.js#L20-L26写法运算符恒等值x 00x - 0-0x * 1*1x / 1/1x ** 1**1恒等值——参与运算后不改变另一操作数结果的数。当引擎看到x * 1它等价于x x * 1而后者就是把x重新赋给x本身。所以这条规则抓的只是一种东西看起来在做运算、实际在原地打转的那行代码通常是重构之后忘删的死代码。白名单地图这些恒等值复合赋值会被放过白名单是规则的另一半。你写出下面这些写法时它们不会被报告写法为什么放过x \| 0、x 0、x -1、x ^ 0位运算是 int32/uint32 强转的惯用手法刻意为之而非失误x % 1x % 1取的是小数部分不是恒等操作x 0n、x * 1nBigInt 字面量不是普通数字字面量x -0、x * 1一元正负号包裹的是UnaryExpression且-0并不总是恒等x 0 as numberTypeScript类型断言表达式不是纯字面量x \|\| 0、x 1、x ?? 0逻辑赋值运算符不在检测范围x 0、x 1普通赋值不是复合赋值x y、x foo()右操作数的运行时值无法静态确定把关的是isNumericLiteral检查rules/ast/literal.js#L29节点必须是Literal且value是 number 才放行再去比对值与当前运算符的恒等值rules/no-useless-compound-assignment.js#L42。过不了这道关的一律跳过。unicorn no-useless-compound-assignment 为什么不能自动修复数值上看x 0确实是恒等操作麻烦在于复合赋值不是纯数字加法结果由变量的运行时取值决定静态分析无法穷举。比如a 0是字符串拼接得到a0而不是a5n * 1会直接抛TypeErrorBigInt 与 Number 不能混算而如果x恰好装着-0做完x 0它就成了0——两者在 IEEE 754 里并不相等。所以规则元数据里不声明 fixer只声明hasSuggestions: truerules/no-useless-compound-assignment.js#L109。自动修复意味着引擎替你默默改写代码上面三个反例都会变成你没预料到的行为变更。建议模式下改动以候选形式交给编辑器呈现由你敲一个键确认——这正是 eslint 建议 vs 自动修复 的本质区别fix 承担风险suggestion 把风险留给确认它的人。修复双轨删整句或换左值命中之后规则先看赋值表达式在 AST 里的位置再决定给哪条建议rules/no-useless-compound-assignment.js#L51-L79。分支长这样x op 恒等值 命中 ├─ 是独立语句且容器为 Program / BlockStatement / StaticBlock / SwitchCase │ └─ 是 → 建议「删除整句」removeStatement连带周边空白 └─ 结果被引用函数实参、return 值、for 更新表达式… └─ 建议「替换为左值」return count - 0 → return count 兜底表达式内部含注释 → 只报错不出建议第一轨调用的是公共助手removeStatementrules/fix/remove-statement.js它把语句连同周围空白一起抹掉但语句之外的尾随注释会原样保留。第二轨的左值直接取自源码文本所以obj.x、this.count、foo.bar.baz这类成员表达式做左值也照样替换得回来。// ❌ 赋值结果被 return 使用 return count - 0; // ✅ 建议给出的结果 return count;测试验证过删除建议覆盖顶层语句、块内缩进语句、switchcase 分支、classstatic块四种容器替换建议则覆盖了成员表达式左值、逗号表达式、for更新表达式等引用场景。边界压力测试4 个容易看漏的写法测试还专门压了几处判定细节值得你过一遍输入预期原因x 0.0、x * 0x1、x - 0e3命中出建议字面量value规范化后就是0/1等价写法逃不掉x -0不命中UnaryExpression而非纯字面量且-0语义本身就是坑x 0; // keep命中仍出「删除整句」注释在语句之外删除助手会保留尾随注释x /* keep */ 0;命中但不出建议注释在表达式内部删除会把它一起弄丢报错信息还会保留字面量的原始文本x 0.0会被报告为 0.0does not change the value你核对代码时一眼能对上位置。启用方式与一段真实 ESLint 报错输出这条规则默认就在recommended与unopinionated两个配置里开启不接收任何选项type: suggestion表明它属于不强加风格偏好的一类。测试快照里记录的一段报错输出长这样1 | x * 1; | ^^^^^^ This compound assignment is useless as * 1 does not change the value. unicorn/no-useless-compound-assignment Suggestion 1/1: Remove the useless assignment.先判恒等再看上下文能否安全动手最后保守出手——这是任何死代码清理规则都值得照抄的模板。【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站