javascript类型判断易错源于动态类型、隐式转换和历史缺陷;应避免typeof判数组/对象(均返"object")、boolean()误判字符串/空对象,而用array.isarray()、object.prototype.tostring()、number.isfinite()等精准工具。

JavaScript中类型判断容易出错,根本原因在于它有动态类型 + 隐式转换 + 历史设计缺陷三重特性。看似简单的typeof、==、Boolean(),实际在边界场景下极易给出反直觉结果。关键不是记规则,而是用对工具、写清意图。
字符串“0”、“false”被当成真值
后端常返回字符串状态码,比如status: "0"表示关闭,但!!"0"或Boolean("0")结果是true——因为所有非空字符串都是真值。
- 别直接转布尔:
if (status) { ... }❌ - 应精准比对:
if (status === "0") { ... }✅ - 或统一转义:
if (status === "1" || status === true)(需约定好语义)
数组和对象都返回"object"
typeof []和typeof {}都返回"object",typeof null也返回"object"——这是JS早期遗留bug,无法改变。
- 判数组用
Array.isArray(arr),不依赖typeof - 判纯对象可用
Object.prototype.toString.call(obj) === "[object Object]" - 更推荐使用
@sindresorhus/is等工具库:is.array(val)、is.plainObject(val)
NaN被当成数字,null被当成对象
typeof NaN === "number"为true,typeof null === "object"也为true,但它们显然不是“正常”的数字或对象。
- 检测有效数字:
Number.isFinite(val)或is.number(val) && !is.nan(val) - 单独判断NaN:
Number.isNaN(val)(比val !== val更可读) - null要显式判断:
val === null,不要混用== null(会同时匹配undefined)
空数组[]、空对象{}被判为真
引用类型只要存在,就是真值。Boolean([])、Boolean({})、Boolean(new Date())全为true,哪怕内容为空。
- 判数组是否为空:
arr.length === 0 - 判对象是否为空:
Object.keys(obj).length === 0 - 需要兼顾
null/undefined时,先守卫再判断:obj && Object.keys(obj).length === 0
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











