数组和对象的本质区别在于构造方式,需用Array.isArray()或Object.prototype.toString.call()精准区分:前者专用于数组判断,后者可统一获取类型标签;instanceof、constructor和typeof均不可靠。

检查数组和对象的区别,关键不是“它像不像一个容器”,而是“它到底是什么构造出来的”。JavaScript 里数组本质是对象,但有专属身份;直接用 typeof 会把两者都判成 "object",所以必须用更精准的方法区分。
用 Array.isArray() 判数组(最推荐)
这是专门为此设计的、标准且可靠的方法,不依赖原型链,也不怕跨 iframe:
-
Array.isArray([])→true -
Array.isArray({})→false -
Array.isArray("hello")→false - 对类数组、arguments、NodeList 等都返回
false,只认真·数组
用 Object.prototype.toString.call() 统一取类型名
这个方法能暴露内部类型标签,结果稳定、覆盖全,适合需要统一处理多种类型的场景:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call({})→"[object Object]" -
Object.prototype.toString.call(null)→"[object Null]" - 可封装成通用函数:
getType = v => Object.prototype.toString.call(v).slice(8, -1),调用getType([])得"Array"
慎用 instanceof 和 constructor
它们看似直观,但在实际项目中容易出问题:
立即学习“Java免费学习笔记(深入)”;
-
[] instanceof Array在当前窗口下是true,但如果数组来自 iframe 或不同 JS 上下文,可能失效 -
[].constructor === Array可被重写(比如Array.prototype.constructor = null),不可靠 -
{}.constructor === Object同样不稳定,尤其在使用 class 继承或 Proxy 时
别用 typeof 区分数组和对象
这是初学者最容易踩的坑:
-
typeof []→"object" -
typeof {}→"object" - 连
typeof null都是"object",说明它根本不适合做精细判断 - 唯一例外是函数:
typeof function(){}→"function",但这和数组/对象无关

















