← [ BACK_TO_NOTES ]

Array.isArray

Array.isArray 判断值是否为规范意义上的数组对象,跨 iframe 比 instanceof 更可靠。

#frontend #concept #evergreen #javascript #ecmascript

[!info] related notes

Array.isArray

一句话定义

Array.isArray(value) 判断值是否为规范意义上的数组对象,是数组判断的标准答案,ES5 引入。

用法

Array.isArray([])              // true
Array.isArray([1, 2, 3])       // true
Array.isArray({})              // false
Array.isArray('hello')         // false
Array.isArray(undefined)       // false

为什么数组需要单独 API

  • typeof [] === "object" — 不能区分数组和普通对象
  • [] instanceof Array — 跨 iframe 时可能返回 false

所以 ES5 专门提供了 Array.isArray()。

原理

它不是看原型链上是不是当前环境的 Array.prototype,而是判断该值是否具有数组的内部品牌(brand) / 内部槽特征。

可以理解为:“这东西是不是规范意义上的真正数组对象?”

因此判断来自同源 iframe 等其他 realm 的数组更可靠。Worker 消息通常通过结构化克隆传值,不是直接共享另一个 realm 的数组引用。

跨 iframe 示例

const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const iframeArray = iframe.contentWindow.Array();

iframeArray instanceof Array      // false(跨 realm 失效)
Array.isArray(iframeArray)        // true(内部品牌判断有效)

toString 判断并不等价

const fake = { [Symbol.toStringTag]: 'Array' };
Object.prototype.toString.call(fake); // '[object Array]'
Array.isArray(fake);                  // false

toString 标签可被 Symbol.toStringTag 改变,不能称为 Array.isArray 的等价实现。Array.isArray 会按规范检查数组及 Proxy 目标;已撤销的 Proxy 会抛 TypeError,并非对任意输入都返回布尔值。

与 instanceof Array 对比

特性Array.isArrayinstanceof Array
跨 iframe稳可能失败
原始值falsefalse
判断依据不读取 toStringTag 或普通原型伪装原型链及 Symbol.hasInstance
语义内部品牌原型链关系

缺点

只解决”数组”这一个问题,不是通用判断方案。

创建于 2026/4/1 更新于 2026/10/7
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本