JS精准判断一个对象是不是数组的方法

 更新时间:2026年05月12日 08:29:32   作者:yqcoder  
这篇文章主要介绍了JavaScript中判断数组的方法,包括Array.isArray()、instanceof、Object.prototype.toString三种方法的优缺点,并给出了一些使用技巧和避坑指南,其中array.isArray()是最推荐使用的方法,准确可靠,跨上下文安全,是最安全、易读的选择

为什么判断数组这么难?

在 JavaScript 中,数组本质上也是一种对象

console.log(typeof []); // "object"
console.log(typeof {}); // "object"

因为 typeof 只能区分基本类型(string, number, boolean, undefined, symbol, bigint)和引用类型(统一返回 object,函数返回 function),所以它无法直接告诉我们:“嘿,这是个数组!”

我们需要更高级的手段来揭开它的真面目。

1. 王者方案:Array.isArray()

这是 ES5 引入的标准方法,也是现代开发中的首选

console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
console.log(Array.isArray("hello")); // false
console.log(Array.isArray(null)); // false

优点

  • 语义清晰:代码可读性极高,一眼就能看懂意图。
  • 准确可靠:内部实现机制完善,能正确处理各种边界情况。
  • 跨上下文安全:即使数组来自不同的 iframe 或 window,它依然能正确识别(因为它不依赖原型链继承关系,而是检查内部标签)。

缺点

  • 兼容性:不支持 IE8 及以下版本(但在 2024 年,这几乎不再是问题)。

博主建议
无脑选它! 除非你有极其特殊的兼容需求,否则 Array.isArray 就是你的唯一选择。

2. 经典方案:instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

const arr = [];
console.log(arr instanceof Array); // true

const obj = {};
console.log(obj instanceof Array); // false

优点

  • 直观:符合面向对象编程的思维逻辑,“这个实例是不是由 Array 构造函数创建的?”

缺点

跨上下文失效:这是最大的坑!
如果页面中有多个 iframe,每个 iframe 都有自己独立的执行环境(也就是独立的 Array 构造函数)。

// 假设 iframe 中的数组传到了主窗口
iframeArray instanceof Array; // false!
// 因为 iframeArray 的原型链指向的是 iframe 里的 Array.prototype,
// 而主窗口里的 Array 是另一个构造函数。
  • 可被篡改:如果开发者手动修改了原型链,instanceof 可能会给出错误结果。

3. 通用方案:Object.prototype.toString

这是一种“黑科技”写法,利用对象内部的 [[Class]] 属性(在 ES5 之前称为 Class 内部属性,现在通过 toString 暴露)。

const arr = [];
console.log(Object.prototype.toString.call(arr)); // "[object Array]"

const obj = {};
console.log(Object.prototype.toString.call(obj)); // "[object Object]"

const str = "hello";
console.log(Object.prototype.toString.call(str)); // "[object String]"

优点

  • 万能 钥匙:不仅能判断数组,还能精准判断 Date, RegExp, Function, Null, Undefined 等所有内置类型。
  • 跨上下文安全:和 Array.isArray 一样,它不受不同 window/iframe 的影响,因为它读取的是底层引擎标记。

缺点

  • 写法繁琐Object.prototype.toString.call(obj) 太长,容易写错。
  • 可读性差:新手可能看不懂这是在干嘛。

技巧
你可以封装一个工具函数:

const typeCheck = (obj) => Object.prototype.toString.call(obj).slice(8, -1);
console.log(typeCheck([])); // "Array"

4. 避坑指南:typeof与constructor

陷阱 1:typeof

如前所述,typeof [] 返回 "object",完全无法区分数组和普通对象。千万别用!

陷阱 2:constructor

const arr = [];
console.log(arr.constructor === Array); // true

看起来不错?但它有两个致命弱点:

可被修改arr.constructor 是可以被人为赋值的,不可信。

arr.constructor = String;
console.log(arr.constructor === Array); // false (误判!)

null/undefined 报错nullundefined 没有构造函数,访问会报错。

5. 跨框架/跨窗口场景的特殊陷阱

这是高级前端面试的常客。

场景:你的主页面嵌入了一个 iframe,iframe 里有一个数组 iframeArr,你把它传回主页面。

方法结果原因
iframeArr instanceof ArrayFalse主页面的 Array 和 iframe 的 Array 不是同一个引用。
Array.isArray(iframeArr)True规范规定它检查内部插槽,不依赖原型链。
Object.prototype.toString.call(iframeArr)“[object Array]”同样基于内部标签,不受上下文影响。

结论
在涉及多窗口、Web Worker 或微前端架构时,严禁使用 instanceof 判断数组,必须使用 Array.isArraytoString 方法。

6.  总结与最佳实践

方法准确性跨上下文安全可读性推荐指数
Array.isArray()⭐⭐⭐⭐⭐✅ 是⭐⭐⭐⭐⭐🌟🌟🌟🌟🌟
Object.prototype.toString⭐⭐⭐⭐⭐✅ 是⭐⭐🌟🌟🌟
instanceof⭐⭐⭐❌ 否⭐⭐⭐⭐🌟🌟
constructor⭐⭐❌ 否⭐⭐⭐❌ 不推荐
typeof❌ 无效-⭐⭐⭐⭐⭐❌ 禁止使用

博主寄语
判断数组看似简单,实则暗藏玄机。

记住一条铁律
永远优先使用 Array.isArray()
它不仅是最标准的 API,也是最安全、最易读的选择。
只有在需要同时判断多种类型(如写一个通用的 typeOf 工具库)时,才考虑使用 Object.prototype.toString

以上就是JS精准判断一个对象是不是数组的方法的详细内容,更多关于JS判断对象是不是数组的资料请关注脚本之家其它相关文章!

相关文章

  • js跑马灯代码(自写)

    js跑马灯代码(自写)

    自己刚写的一个小程序,写得满一般的,不过这个接口还成,感兴趣的朋友可以参考下哈,希望对你学习js知识有所帮助
    2013-04-04
  • MUI 上拉刷新/下拉加载功能实例代码

    MUI 上拉刷新/下拉加载功能实例代码

    这篇文章主要介绍了MUI 上拉刷新/下拉加载功能实例代码,包括一些个人心得,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-04-04
  • JavaScript知识点整理

    JavaScript知识点整理

    本文是脚本之家小编日常整理的关于javascript知识点,包括javascript拥有的特点,组成部分,数据类型等方面,对javascript知识点相关知识感兴趣的朋友一起学习吧
    2015-12-12
  • 在JavaScript中通过URL传递汉字的方法

    在JavaScript中通过URL传递汉字的方法

    在JavaScript中通过URL传递汉字的方法...
    2007-04-04
  • big.js 如何解决精度丢失问题源码解析

    big.js 如何解决精度丢失问题源码解析

    这篇文章主要为大家介绍了big.js 如何解决精度丢失问题源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • JavaScript实现网页截图功能

    JavaScript实现网页截图功能

    这篇文章主要介绍了JavaScript实现网页截图功能,本文介绍了2款实现JavaScript截图的开源组件,一个是Canvas2Image,一个是html2canvas,需要的朋友可以参考下
    2014-10-10
  • js实现轮播图特效

    js实现轮播图特效

    这篇文章主要为大家详细介绍了js实现轮播图特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • window.location 对象所包含的属性

    window.location 对象所包含的属性

    这篇文章主要介绍了window.location 对象所包含的属性,这些熟悉都是工作中经常会用到的,很实用,需要的朋友可以参考下
    2014-10-10
  • JavaScript中的高级特性分享

    JavaScript中的高级特性分享

    JavaScript是一种功能强大的编程语言,具有许多高级特性,本文将介绍JavaScript中的一些高级特性,包括闭包、原型继承、高阶函数、异步编程和模块化,希望对大家有所帮助
    2023-06-06
  • JS实现的通用表单验证插件完整实例

    JS实现的通用表单验证插件完整实例

    这篇文章主要介绍了JS实现的通用表单验证插件,可针对常见的日期、密码、姓名等进行验证并给出提示信息,非常具有实用价值,需要的朋友可以参考下
    2015-08-08

最新评论