【JavaScript数据结构系列】01-数组Array

码路工人 CoderMonkey

转载请注明作者与出处

# 【JavaScript数据结构系列】

# 01-数组Array

数组:

是有序的元素序列

元素通常是同一数据类型

下标索引通常从 0 开始

数组是JavaScript中最常用的数据结构,
在ES6之前也JS中也只有数组这一种数据结构,
ES6之后加入了Set和Map。
(包括WeakSet和WeakMap)

JS中的数组Array,
基于数组数据结构做的封装,
JS封装的数组使用起来更方便。
其它的数据结构也会基于数组进行封装实现。

我们分以下及部分来讲:

  • 原本的数组
  • JS中的数组
    • ES5之前的数组
    • ES6之后的数组

Original Array

原始数组具有以下特点:

  • 属于线性结构
  • 固定的长度/容量
  • 具有下标/索引

因此,数组具有以下优点:

  • 通过下标索引访问查找元素非常方便高效
  • 通过下标索引方便遍历元素
  • 可以在任意位置插入删除元素

同样,数组也有相应的劣势:

  • 固定长度,不便于处理非定长数据
    而数据一般都是动态的,需要手动扩容/缩容
  • 需要进行遍历才能通过元素进行查找
    时间复杂度高
  • 插入删除元素时需要移动其它元素位置
    增加删除元素效率低
  • 通常只能存储一种数据类型

另外,数组可以是一维数组,也可以有二维数组,
也就是说,数组嵌套,元素也是数组。


JS中的数组

JavaScript中提供了数组这种数据类型,
不再需要我们自己封装。
JS中的Array不同于原始数组,
不再是固定长度,你可以几乎无限的push进元素,
因为它在底层实现上自动扩容的,让你感觉不到固定长度的限制。
另外,也可以存放不同类型的数据。

数组有length属性,提供了一系列操作数组数据的方法。
还有它的近亲,类数组(就是类似于数组的意思),
同样具有length属性,但不具有Array.prototype上的方法,
我们通常是通过改变this指向来借用数组的方法。
例如:

function test() {
var args = [].slice.call(arguments,0, arguments.length)
console.log(args)
}
test(1,2,3,4)
// (4) [1, 2, 3, 4]
// 0: 1
// 1: 2
// 2: 3
// 3: 4
// length: 4
// __proto__: Array(0)

※新语法里可以将可迭代对象转为数组,获取数组更简便

你能不眨眼一口气说出 JavaScript 中数组的所有方法吗?

因ES6版本发生重大变化,所以分ES5之前跟ES6之后来说。

ES5之前常用的数组方法有:

静态方法

方法 描述
Array.isArray() 判断对象是否为数组。

实例方法

方法 描述
concat() 连接两个或更多的数组,并返回结果。
every() 检测数值元素的每个元素是否都符合条件。
filter() 检测数值元素,并返回符合条件所有元素的数组。
forEach() 数组每个元素都执行一次回调函数。
indexOf() 搜索数组中的元素,并返回它所在的位置。
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
lastIndexOf() 搜索数组中的元素,并返回它最后出现的位置。
map() 通过指定函数处理数组的每个元素,并返回处理后的数组。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reduce() 将数组元素计算为一个值(从左到右)。
reduceRight() 将数组元素计算为一个值(从右到左)。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
some() 检测数组元素中是否有元素符合指定条件。
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素。
toSource() 返回该对象的源代码。
toString() 把数组转换为字符串,并返回结果。
toLocaleString() 把数组转换为本地数组,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
valueOf() 返回数组对象的原始值

*以上参考自:
 [W3School](https://www.w3school.com.cn/jsref/jsref_obj_array.asp)
 [菜鸟教程]https://www.runoob.com/jsref/jsref-obj-array.html)

ES6之后新增的数组方法有:

静态方法

方法 描述
Array.from 可以将类数组对象(array-like object)或可迭代对象(iterable object)转为数组。
Array.of 将一组值转换为数组

实例方法

方法 描述
copyWithin() 在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。
find() 找出第一个符合条件的数组成员。
findIndex() 返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
fill() 初始化一个用指定元素填充的新数组。
entries() 用于数组遍历,返回键值对的遍历器对象。
keys() 用于数组遍历,返回键的遍历器对象。
values() 用于数组遍历,返回值的遍历器对象。
includes() 判断数组是否包含指定的值,返回布尔值结果。
flat() 将二维数组变为一维数组(即嵌套多层时只能减少一层)。
flatMap() 相当于flat方法加map方法。

*ES6内容建议参考阮老师的电子书(直接点上面的方法也可跳转)
 http://es6.ruanyifeng.com/

以上方法的使用具体参照链接就可以了,不再赘述。
我们的主要精力将放在数据结构本身上。

  • 数组作为JavaScript中的重要类型,数组操作是需要掌握好的必备技能
  • 单就数组就可以开一个专题,内容庞杂。
  • 有时候一个关于高阶函数方法就可以单独开篇长文(码路工人这里有很多优秀的文章---想给推荐给大家---,那些作者才是真大佬、前端大侠,还有全栈牛人,读大佬们的文章也是码路工人自我提升中不断汲取营养的来源之一)

做了一份 npm 工具包 data-struct-js ,
基于 ES6 实现的 JavaScript 数据结构,
也许这个小轮子很少会被使用,
也许对于初学者学习 JavaScript 会有点帮助。
只要简单 install 一下即可,感兴趣的话还可以去
GitHub / Gitee 看源码。(Star 表支持~)

npm install data-struct-js --save-dev

最后,感谢您的阅读和支持~


-End-

【JavaScript数据结构系列】01-数组Array的更多相关文章

  1. 【JavaScript数据结构系列】03-队列Queue

    [JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...

  2. 【JavaScript数据结构系列】00-开篇

    [JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...

  3. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  4. 【JavaScript数据结构系列】05-链表LinkedList

    [JavaScript数据结构系列]05-链表LinkedList 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识链表结构(单向链表) 链表也是线性结构, 节点相连构成链表 ...

  5. 【JavaScript数据结构系列】04-优先队列PriorityQueue

    [JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...

  6. 【JavaScript数据结构系列】02-栈Stack

    [JavaScript数据结构系列]02-栈Stack 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的 ...

  7. JavaScript数据结构与算法-数组练习

    一. 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩的方法. // 创建一个记录学生成绩的对象 const Students = function Students () ...

  8. 【JavaScript数据结构系列】07-循环链表CircleLinkedList

    [JavaScript数据结构系列]07-循环链表CircleLinkedList 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识循环链表 首节点与尾节点相连的,就构成循环链表.其 ...

  9. 【JavaScript数据结构系列】06-双向链表DoublyLinkedList

    [JavaScript数据结构系列]06-双向链表DoublyLinkedList 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识双向链表 不同于普通链表/单向链表,双向链表最突出 ...

随机推荐

  1. Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)

    To become the king of Codeforces, Kuroni has to solve the following problem. He is given n numbers a ...

  2. SQL 文件导入数据库

    1.首先通过 xshell 连接数据库服务器,执行命令 mysql -u root -p 命令,按照提示输入密码,连接上数据库 2.在连接终端上执行命令 create database JD_Mode ...

  3. python selenium(定位方法)

    一.定位方法 注意:元素属性必须唯一存在 #id定位 find_element_by_id() #name定位 find_element_by_name() #class_name定位 find_el ...

  4. 一个简单的wed服务器SHTTPD(2)———— 客户端请求分析

    //start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...

  5. 蓝桥杯2019初赛]迷宫(dfs版本)

    传送门 大意: 题目的意思还是模板的搜索,不同的是我们要记录路径了,而且是最短字典序最小的路径. 思路: 1.对于字典序最小,也就是说我们要尽量先往下走,然后是左- 这个很简单,因为在dfs中是顺序枚 ...

  6. 王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结

    实验四 类与对象的定义及使用 实验时间 2018-9-20 1.目的与要求 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类的基本使用方法,熟悉Math ...

  7. NFS服务器搭建-共享PC与ARM主板文件

    NFS服务器搭建-共享PC与ARM主板文件 在搭建好交叉编译环境之后需要实现目标板与宿主机的文件共享,在这里选择NFS,由于资料较多.需要注意的以下几点: 目标板与宿主机需要连接在同一个网段内. 宿主 ...

  8. MYSQL 日月周季年分组

    首先准备几条测试数据 DROP TABLE IF EXISTS `test`;CREATE TABLE `test` ( `n_id` int(11) DEFAULT NULL, `d_created ...

  9. 最简单的手机预览WEB移动端网页的方法

    网上看了很多关于该问题的解决办法,各种各样的都有,个人也测试了一些, 最后总结出一个最简单且实用的方法. 1.安装nodejs node官网下载对应版本的nodejs,安装好了之后,在node.js执 ...

  10. mysql5.7 derived_merge=on 影响你的查询了吗?

    衍生表的优化:合并 | 具化 一.mysql优化器对于衍生表的优化处理可以从两方面进行: 将衍生表合并到外部查询 将衍生表具化为内部临时表 1.示例 1: SELECT * FROM (SELECT ...