数组判断?我早不用instanceof了,现在一行代码搞定!

传统方案

1. Object.prototype.toString.call 方法

原理 :通过调用 Object.prototype.toString.call(obj) ,判断返回值是否为 [object Array]

js 复制代码
function isArray(obj){
  return Object.prototype.toString.call(obj) === '[object Array]';
}

缺陷

  • ES6 引入 Symbol.toStringTag 后,可被人为篡改。例如:

    js 复制代码
    const obj = {
      [Symbol.toStringTag]: 'Array'
    };
    console.log(Object.prototype.toString.call(obj)); // 输出 [object Array]
  • 若开发通用型代码(如框架、库),该漏洞会导致判断失效。

2. instanceof 方法

原理 :判断对象原型链上是否存在 Array 构造函数。

js 复制代码
function isArray(obj){
  return obj instanceof Array;
}

缺陷

  • 可通过 Object.setPrototypeOf 篡改原型链,导致误判。例如:

    js 复制代码
    const obj = {};
    Object.setPrototypeOf(obj, Array.prototype);
    console.log(obj instanceof Array); // 输出 true,但 obj 并非真正数组
  • 跨 iframe 场景失效。不同 iframe 中的 Array 构造函数不共享,导致真数组被误判为非数组。例如:

    js 复制代码
    const frame = document.querySelector('iframe');
    const Array2 = frame.contentWindow.Array;
    const arr = new Array2();
    console.log(arr instanceof Array); // 输出 false,但 arr 是真正数组

ES6 原生方法

方法 :使用 Array.isArray 静态方法。

js 复制代码
console.log(Array.isArray(arr));

优势

  • 该方法由JavaScript引擎内部实现,直接判断对象是否由 Array 构造函数创建,不受原型链、 Symbol.toStringTag 或跨 iframe 影响;

  • 完美解决所有边界场景。

总结

判断数组的方法中 Array.isArray 是唯一准确且无缺陷的方案。其他方法(如Object.prototype.toString.callinstanceof)均存在局限性,仅在特定场景下可用。

相关推荐
_阿南_2 小时前
项目中新增给AI制定的代码规范
前端·程序员
名字还没想好☜3 小时前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
自动化监测Learner3 小时前
主流 Web 端地图引擎对比:选型指南与优劣分析
javascript
console.log('npc')4 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
爱学堂IT分享5 小时前
Cesium可视化系统实战课程-Cesium教程学习
前端
糖墨夕5 小时前
理解大语言模型:Agent 的“大脑”
前端·agent
Rain的Java大神之路5 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
cpolar技术支持6 小时前
浏览器也能跑本地 AI:用 Transformers.js + WebGPU 做一个最小推理 Demo,cpolar 给同事远程体验
前端·ai·cpolar·webgpu·transformers.js
计算机魔术师7 小时前
OpenAI 发布 GPT-6 Astra:多项基准刷新纪录, cybersecurity 能力达 Critical 阈值
前端
xy34537 小时前
Axure9.0中继器遮罩实现方法
前端·ui·html·axure·原型·产品设计