JavaScript数组是继承自Object.prototype的特殊对象,具有内部槽[[ArrayLength]]、稀疏索引机制和专属原型方法;它本质是键值对容器,仅对数字字符串键做优化;Array.isArray()是唯一可靠判断方式。

因为 JavaScript 中的数组底层就是基于对象实现的,它继承自 Object.prototype,具备对象的所有基本特征。
它能像对象一样动态添加属性和方法
你可以给数组随意加字符串键名的属性,比如 arr.name = "myList" 或 arr.version = 1.0,这些属性不会影响 length,也不会被 forEach、map 等数组方法遍历到——这正是普通对象的行为。
-
typeof []返回"object" -
[] instanceof Object返回true -
Array.prototype.__proto__ === Object.prototype成立
它的索引本质上是字符串键
写 arr[0] 实际等价于 arr["0"]。JavaScript 引擎会把数字索引自动转成字符串作为属性名,然后存进内部的对象结构里。这也解释了为什么 1 in arr 和 arr.hasOwnProperty("1") 是有效的判断方式。
- 稀疏数组(如
[1,,3])中,中间缺失的索引根本没存任何键值对 - 你可以手动设置
arr["hello"] = "world",它和arr[999]在存储机制上没有本质区别
它拥有对象的原型链和运行时行为
数组实例不仅能访问 Array.prototype 上的方法(如 push、filter),也能访问从 Object.prototype 继承来的方法(如 toString、hasOwnProperty)。它的 length 属性是 getter/setter,背后依赖内部槽 [[ArrayLength]],这种封装方式也和对象属性描述符机制一致。
立即学习“Java免费学习笔记(深入)”;
-
arr.toString()来自Object.prototype -
arr.map来自Array.prototype - 所有数组方法都通过原型链查找执行,不是硬编码在每个实例上
但它不是“普通对象”,有专属语义
虽然数组是对象,但引擎对数字字符串键做了特殊处理:自动维护 length、支持 for...of 迭代、触发 Array.isArray() 为 true。这些是语义约定,不是语法强制。你不能靠 typeof 或 instanceof Object 准确识别数组,唯一可靠的是 Array.isArray()。
- 伪数组(如
{0: 'a', length: 1})Array.isArray()返回false - 跨 iframe 场景下,
instanceof Array可能失效,Array.isArray()仍准确 - 真正接近传统数组的是
TypedArray,它不继承自Object,也没有push


















