所有比较必须用===和!==,禁用==与!=;输入数据需显式转换校验;禁止隐式类型转换;强制typescript严格模式并集成eslint类型检查。

统一使用严格相等运算符
所有比较逻辑必须用 === 和 !==,禁用 == 与 !=。ESLint 配置中启用 eqeqeq 规则,并设为错误级别。
- 不允许出现
if (value == null),应写成if (value === null || value === undefined)或更推荐的if (value == null)(仅限此特例,因语义明确且被广泛接受) - API 响应字段比较时,如
res.status == 200必须改为res.status === 200 - 枚举值、状态码、布尔标识等固定类型字段,强制要求类型一致再比较
输入数据必须显式转换并校验
来自 DOM、URL 参数、localStorage、后端 API 的任意数据,默认视为字符串或未知类型,不得直接参与运算或条件判断。
- 数字场景:统一用
Number(input)转换,配合isNaN()与isFinite()校验;避免parseInt(除非明确需截断)和+运算符(可读性差) - 布尔场景:用
Boolean(value)或value === 'true'(针对字符串标识),禁止if (input)直接判空数组/对象/0/'0'/'' 等歧义值 - 封装工具函数:如
safeParseInt(str, fallback = 0)、toBooleanish(str),在项目 utils 中统一管理
禁止原始包装对象与隐式 ToPrimitive 行为
避免依赖 toString()、valueOf() 或抽象相等算法触发的自动转换,尤其在对象与原始值混合比较时。
- 禁用类似
[] == false、[1] + [2]、{} + []等表达式,CI 中通过 ESLint 插件no-implicit-coercion拦截 - 自定义对象参与比较时,显式定义
Symbol.toPrimitive方法,或改用.equals()等语义清晰的实例方法 - 模板字符串中禁止拼接未转类型的变量:
`ID: ${id}`应确保id已是字符串,否则先String(id)
工程级防御:TypeScript + 工具链兜底
隐式转换问题本质是类型模糊,企业级项目必须将防御前移到开发阶段。
- 全量迁移 TypeScript,启用
strict: true,特别是noImplicitAny、strictNullChecks、alwaysStrict - ESLint 集成
@typescript-eslint插件,开启no-base-to-string、no-unsafe-argument、restrict-plus-operands等规则 - CI 流程中加入
tsc --noEmit类型检查,失败即阻断合并;对遗留 JS 文件启用 JSDoc +@ts-check渐进增强
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











