数组是object的子类型,typeof [] === 'object'为true但无法区分数组与普通对象;判断纯对象需结合object.prototype.tostring.call(value) === '[object object]'与!array.isarray(value);判断数组应使用array.isarray(value)。

数组在 JavaScript 中确实是 Object 的一种,所以用 typeof [] === 'object' 会返回 true,但这无法区分普通对象和数组。真正要“判断是不是 Object(且不是 Array)”,关键在于明确需求:你是想排除数组、只认纯对象,还是想确认它是一个数组?下面分情况说明。
判断是否为纯对象(Plain Object,即 {} 类型)
纯对象指通过 {}、new Object() 或 Object.create(null)(需额外处理)创建的普通键值对对象,不包括数组、日期、正则、函数等。
- 推荐方法:用
Object.prototype.toString.call(value) === '[object Object]' - 再进一步排除数组:加上
!Array.isArray(value)
组合写法:
function isPlainObject(value) {
return Object.prototype.toString.call(value) === '[object Object]' &&
!Array.isArray(value);
}
✅ 这能准确识别 {a: 1}、new Object();❌ 排除 []、new Date()、/regex/、null、undefined 等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
判断是否为数组(最可靠方式)
直接用内置 API:Array.isArray(value) —— 它是 ES5 标准方法,跨环境兼容性好,且能正确处理 iframe 等不同执行上下文中的数组。
- ✅
Array.isArray([])→true - ✅
Array.isArray(new window.Array())(跨 iframe 也有效) - ❌
Array.isArray({})、Array.isArray(null)→false
不要用 value.constructor === Array 或 value instanceof Array,它们在多窗口/iframe 场景下可能失效。
为什么 typeof [] === 'object' 是对的,但不够用?
因为 JavaScript 中,除基本类型(string、number、boolean、null、undefined、symbol、bigint)外,其余都是对象。数组、函数、日期、正则等都继承自 Object,所以 typeof 统一返回 'object'(null 是历史 bug,也返回 'object')。
所以单靠 typeof 无法做精细类型判断,必须配合其他手段,比如 toString.call 或专用方法如 Array.isArray。
小结:按目标选方法
- 想确认“这是个数组” → 用
Array.isArray(value) - 想确认“这是个纯对象,不是数组/日期/正则等” → 用
Object.prototype.toString.call(value) === '[object Object]'并排除数组 - 避免用
typeof value === 'object'单独判断,它太宽泛,几乎没区分度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










