最直接有效的方式是:用===替代==,数值运算前显式转数字,字符串拼接优先用模板字面量,真假判断时避免依赖自动转换。

最直接有效的方式是:用 === 替代 ==,对数值运算前显式转数字,字符串拼接优先用模板字面量,真假判断时避免依赖自动转换。
用严格相等(===)代替双等号(==)
== 会触发抽象相等算法,悄悄把两边转成同一类型再比较,结果常违背直觉:
-
0 == false→true -
"0" == false→true -
[] == false→true -
null == undefined→true(但null === undefined是false)
换成 === 后,类型不同直接返回 false,逻辑清晰、可预测。ESLint 的 eqeqeq 规则可强制执行这一习惯。
数值运算前主动做显式转换
不要让 +、-、* 等运算符替你猜类型。比如用户输入的 "42px" 或 " 100 ",隐式转数字会得 NaN 或 100,但没人知道。
- 取整数:用
parseInt(str, 10),并检查是否为NaN - 转浮点:用
parseFloat(str) - 通用转数字:用
Number(str),配合Number.isFinite()校验 - 避免一元加号
+str:语义模糊,易误读(如+"1.5"是1.5,但+"1.5px"是NaN)
字符串拼接不靠 + 猜意图
value + "ms" 看似简单,但若 value 是数组、对象或 null,结果可能是 "1,2ms"、"[object Object]ms" 或 "nullms"。
- 推荐写法:
${String(value)}ms或${value.toString()}ms - 更稳妥:用
String(value)显式转,它对null和undefined返回"null"和"undefined",行为确定 - 避免
value + ""这类“伪显式”写法——本质仍是隐式调用ToString
真假判断时明确边界含义
if (x) 把 0、""、null、undefined、NaN 全当假值,但业务中“值为 0”和“值未传入”往往意义不同。
- 检查是否为有效数字:
x !== null && x !== undefined && !isNaN(x) && isFinite(x) - 只排除空缺:
x != null(等价于x !== null && x !== undefined) - 判断数组非空:
Array.isArray(x) && x.length > 0,而不是if (x) - 避免
!!x:虽常见,但掩盖了真实意图,建议用Boolean(x)或直接写出条件











