知识卡片

数组也是对象

普通读书笔记卡 · 1494

内容

JS 没有真正连续内存数组,而是带类数组特性的对象:下标转字符串属性名,检索更新方式与普通对象一致,多了整数属性名特性,继承自 Array.prototype 而非 Object.prototype(因此有 length 和数组方法)。这比真正数组慢但更方便,也允许混放任意类型值。发散:理解这点后,稀疏数组、类型混放和性能差异就不再意外。

参考来源

- 位置:《JavaScript语言精粹(修订版)》第6章《数组 Arrays》开篇与"数组字面量"一节 - 结论依据:原文说明真正的数组是线性分配内存、通过整数偏移访问,而 JavaScript "没有像此类数组一样的数据结构",提供的是"拥有一些类数组特性的对象",把下标转成字符串属性名;并用 numbers 与 numbers_object 对比说明前者继承自 Array.prototype、有 length 属性,据此推出 JavaScript 数组本质是特殊对象的结论。 - 原始内容:数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素……JavaScript没有像此类数组一样的数据结构。作为替代,JavaScript提供了一种拥有一些类数组(array-like)特性的对象。它把数组的下标转变成字符串,用其作为属性。