typeof无法区分数组和普通对象,因为数组本质是特殊对象,而typeof对所有引用类型(除函数外)统一返回"object";推荐使用Array.isArray()判断,它准确、标准且兼容性好。

typeof 无法区分数组和普通对象,它对两者都返回 "object"。
为什么 typeof 判别不了数组?
这是 JavaScript 的历史遗留问题:数组本质上是特殊的对象,而 typeof 在语言设计初期只做了粗粒度类型检查,所有引用类型(除函数外)统一返回 "object"。所以:
-
typeof []→"object" -
typeof {}→"object" -
typeof new Date()→"object"
推荐的替代方案:Array.isArray()
这是最标准、最可靠的方法,专为判断数组设计:
-
Array.isArray([])→true -
Array.isArray({})→false -
Array.isArray(null)→false -
Array.isArray("abc")→false
它在所有现代环境(包括 IE9+)中都可用,语义清晰,无兼容性陷阱。
立即学习“Java免费学习笔记(深入)”;
其他可行但需注意的判断方式
如果因兼容性或特殊场景不能用 Array.isArray,可考虑:
-
Object.prototype.toString.call(value) === "[object Array]":准确、兼容性好,但写法稍长 -
value instanceof Array:在同源、单全局环境里有效;跨 iframe 或不同上下文时可能失效 Array.isArray是首选,其余属于备用或教学用途
不建议用的方法
避免使用以下方式,它们不可靠:
-
typeof value === "object" && value.length !== undefined:类数组对象(如arguments、NodeList)也有length -
value.constructor === Array:构造器可被修改,且跨 iframe 失效 -
value.push && value.pop:仅凭方法存在无法保证是数组(可手动添加这些方法)
不复杂但容易忽略:类型判断要讲求准确性和一致性,Array.isArray 就是为此而生的标准答案。


















