>[success] # 数组 ~~~ 1.数组(Array)是一种线性表数据结构。它用一组'连续的内存空间', 来存储一组'具有相同类型的数据'。 2.线性表,线性表可以理解数据排成像一条线一样的结构。每个线性 表上的数据最多只有前和后两个方向。 3.注释:js 数组不是传统意义上的数组,采用的也不是线性表的形式, 在 JavaScript 中,数组是哈希映射,表现形式类似于链表,但如今编译器 已经在为类型一致的数组分配连续的存储空间了(这里还是有点疑问??) 4.JS中的数组结构非常的简单(已经是浏览器帮助我们进行封装处理好的)可以存储不同的数据类型值 数组容量伴随存储的内容自动缩放 5.数组这种结构: 优势:基于索引直接进行查找和获取,效率很高 弊端:进行中间插入和删除操作时,性能非常低(数组塌陷和删除中间项的优化) ~~~ [js数组中文,下面给出英文原文章地址](https://juejin.im/entry/59ae664d518825244d207196) 作者:[Paul Shan](https://link.juejin.im/?target=http%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttp%253A%2F%2Fvoidcanvas.com%2Fauthor%2Fpaulshan%2F)原文:[Diving deep into JavaScript array - evolution & performance](https://link.juejin.im/?target=http%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttp%253A%2F%2Fvoidcanvas.com%2Fjavascript-array-evolution-performance%2F) >[danger] ##### 线性表给数组带来的优势 ~~~ 1.如图,图片来自极客时间,通过图片可以看出数组在内存中开辟一块连续的、 大小相同的空间,用来存储数据 2.因为'连续的内存空间和相同类型的数据',这两个特性使得可以让数据进行随机访问, 即他的查询速度为O(1),也正是这个特性导致他的删除和插入某个元素后还要保证其 内存的连续性,因此速度为O(n) 3.以下图为例该数组的长度为10,分配的空间地址为1000-1039,其中首项的地址为1000 即根据这个可以得到个简单的公式'a[i]_address = base_address + i * data_type_size', 因此当我们取值的时候完全是脚标i这个常量控制因此复杂度为O(1),更准确地说:数组支持随机访问, 根据下标随机访问的时间复杂度为 O(1) 4.一下图为例如果是删除和插入,如果当插入或删除的是是末尾,即直接在末尾加入对应的内存空间 地址和数据复杂度为O(1),那如果是头部,则其他位置的数据的所有内存地址都需要进行平移则复杂度 为O(n),那他们的平均复杂度为O(n) ~~~ ![](https://img.kancloud.cn/a7/3a/a73a178f6c11de07cbce81612c795b83_514x273.png) * js查询和添加和删除的例子 ~~~ 1.通过下面案例可以看出及时是js数组,像首位插入数据和删除数据都O(n),如果频繁对头部做操作并且数据 量较大的时候还是要考虑这方面 ~~~ ~~~ var arr=[]; for(var i=0;i<=1000000;i++){ arr.push('abcdefghigk'+i); } console.time('arr'); arr.push(1) console.timeEnd('arr'); console.time('arr1'); arr.unshift('1') // 查询耗时最多的 console.timeEnd('arr1'); console.time('arr2'); arr[1000000] console.timeEnd('arr2'); ~~~