应统一使用===替代==,因其不进行类型转换、行为可预测;==会触发隐式转换导致反直觉结果(如[]==false为true),而===类型不同直接返回false。

最直接有效的方式是统一用 === 替代 ==,并配合显式类型转换和语义化判断;隐式转换本身不是错误,但失控时会悄悄改逻辑,比如 [] == false 返回 true,而你本意可能是检查数组是否为空。
用严格相等(===)代替宽松相等(==)
== 会触发抽象相等算法,自动调用 ToNumber、ToString 或 ToBoolean,导致大量反直觉结果:
-
"0" == false→true(字符串转数字为 0,false 也转为 0) -
0 == ""→true(空字符串转为 0) -
null == undefined→true(虽有特殊规则,但语义完全不同)
用 === 能立刻暴露类型不一致问题,让比较行为可预测、易调试。它不尝试转换,类型不同直接返回 false。
数值运算前主动归一化
不要依赖 +、- 等运算符自动转数字,尤其面对用户输入或 API 数据:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 优先用
Number(str):失败返回NaN,便于后续校验 - 需要整数时用
parseInt(str, 10):明确进制,避免"08"被误当八进制 - 避免
+"1.5"这类简写:语义模糊,且与parseInt("1.5")行为不一致
例如:const num = Number(input.trim()); if (!isNaN(num) && isFinite(num)) { /* 安全使用 */ }
字符串拼接与布尔判断要讲清楚意图
别让引擎猜你要什么:
- 拼接字符串时,用
String(value)或模板字面量${value},而非value + "" - 真假判断不能只靠
if (val):空数组[]、字符串"0"、对象{}都是真值,但业务上可能需特殊处理 - 想检查是否为
null或undefined,用val == null(兼容两者)或分开写val === null || val === undefined - 想确认是否为空数组,写
Array.isArray(val) && val.length === 0,而不是!val
借助工具提前拦截危险写法
单靠记忆容易漏,工程化防护更可靠:
- ESLint 开启规则:
eqeqeq(强制 ===)、no-implicit-coercion(禁用!!x、+x等隐式简写)、no-eq-null(禁止== null) - 函数入参做类型归一:如接收 ID,直接
const id = Number(input),再判断有效性 - 结合 TypeScript:静态类型检查能在编码阶段发现多数类型不匹配问题
多一次显式转换,少十个深夜 debug。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










