JavaScript数组
数组的概念
之前学习的变量, 一个变量只能存储一个值,如果我们想存储班级中所有学生的姓名时, 那么该如何存储呢?
- 可以使用数组(Array)。数组可以把一组相关的数据—起存放,并提供方便的访问(获取)方式。
什么是数组呢?
- 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任何类型的元素。
数组的创建与初始化
利用 new 创建数组
1 | // 利用 new 创建数组 |
用数组字面量创建数组
- 数组的字面量是方括号[ ]
- 声明数组并赋值称为数组的初始化
1 | //利用数组字面量创建数组 [] |
创建数组并初始化
- 这种字面量方式创建数组,也是我们以后最多使用的方式
1 | // 利用数组字面量创建数组 [] |
数组元素的类型
- 01 和其它编程语言不同,如果数组对应的索引中没有存储数据,默认存储的就是 undefined
- 02 JavaScript 中访问了数组中不存在的索引不会报错, 会返回 undefined
- 03 JavaScript 的数组可以存储不同类型数据
1 | //数组中可以存放任意类型的数据,例如字符串,数字,布尔值等 |
- 04 数组元素的存储
- 和其它编程语言不同, JavaScript 中数组分配的存储空间不一定是连续的
- 其它语言数组分配的存储空间都是连续的, JavaScript 数组是采用”哈希映射”方式分配存储空间
- 什么是哈希映射? 好比字典可以通过偏旁部首找到对应汉字, 我们可以通过索引找到对应空间
- 在浏览器中各大浏览器也对数组分配存储空间进行了优化
- 如果存储的都是相同类型的数据, 那么会尽量分配连续的存储空间
- 如果存储的不是相同的数据类型, 那么就不会分配连续的存储空间
数组的索引
- 索引下标:用来访问数组元素的序号(数组索引从0开始)。
1 | //数组的索引: 用来访问数组元素的序号(数组下标从0开始)。 |
- 数组可以通过索引来访问、设置、修改对应的数组元素, 我们可以通过
arr[1]
的形式来获取数组中的元素。
1 | //定义数组 |
1 | /* 案例:定义一个数组,里面存放星期一、星期二.... 直到星期日(共7天),在控制台输出:星期日。*/ |
新增数组元素
- 可以通过修改 length 长度来实现数组扩容的目的
- length 属性是可读写的.
1 | // 1. 新增数组元素 修改length长度 |
- 其中索引号是 3,4 的空间没有给值,默认值就是 undefined。
- 可以通过修改数组索引的方式追加数组元素
- 不能直接给数组名赋值,否则会覆盖掉以前的数据
1 | // 2. 新增数组元素 修改索引号 追加数组元素 |
数组长度
数组的长度就是元素的个数
和其它编程语言不同, 当 JavaScript 中数组的存储空间不够时数组会自动扩容
1 | let arr = new Array(3); // 定义一个长度为 3 的空数组 |
1 | var arr = ['关羽', '张飞', '马超', '赵云', '黄忠', '刘备', '姜维', 'pink']; |
1 | var arr = ['关羽', '张飞', '马超', '赵云', '黄忠', '刘备', '姜维', 'pink']; |
清空数组
1 | let arr = [1, 2, 3, 4, 5]; |
遍历数组
什么是遍历数组
- 数组中的每—项我们怎么取出来?
- 答:可以通过“数组名[索引号] " 的方式—项项的取出来
1 | // 遍历数组:就是把数组的元素从头到尾访问一次 |
怎么把数组里面的元素全部取出来?
规律:
- 从代码中我们可以发现,从数组中取出每一个元素时,代码是重复的,有所不一样的是索引值在递增,答案就是循环
遍历:数组的遍历就是依次取出数组中存储的所有数据, 我们就称之为数组的遍历,就是把数组中的每个元素从头到尾都访问—次
1 | // 遍历数组:就是把数组的元素从头到尾访问一次 |
【案例】遍历数组
- 请将数组 [‘关羽’,’张飞’,’马超’,’赵云’,’黄忠’,’刘备’,’姜维’] 里的元素依次打印在控制台:
1 | var arr = ['关羽', '张飞', '马超', '赵云', '黄忠', '刘备', '姜维'] |
【案例】求和及平均值
1 | // 1. 求数组 [2,6,1,7, 4] 里面所有元素的和以及平均值。 |
【案例】求最大值
1 | // 求数组[2,6,1,77,52,25,7]中的最大值 |
【案例】指定字符分隔数组
1 | // 将数组 ['red', 'green', 'blue', 'pink'] 转换为字符串,并且用 | 或其他符号分割 |
遍历数组小结
- 01 什么是遍历?
- 遍历数组:就是把数组的元素从头到尾访问一次
- 02 我们通过什么来遍历数组里面的元素?
- for 循环
- 03 for 里面的 i 是什么?当什么使用?for 里面的数组元素怎么写?
- i 是计数器,当索引号使用,
arr[i]
是数组元素第 i 个数组元素
- i 是计数器,当索引号使用,
- 04 怎么获取数组的长度?
- 使用 数组名.length
(arr.length)
可以访问数组的元素数量(数组长度)
- 使用 数组名.length
- 05 数组索引号和数组长度有什么关系?
- 索引号从0开始,数组长度是元素个数
【案例】遍历填充数组
1 | // 新建一个数组,里面存放10个整数( 1~10) |
【案例】筛选出指定值
1 | // 将数组 [2, 0, 6, 1, 77, 0, 52, 0, 25, 7] 中大于等于 10 的元素选出来,放入新数组。 |
【案例】删除指定值
1 | // 将数组[2, 0, 6, 1, 77, 0, 52, 0, 25, 7]中的 0 去掉后,形成一个不包含 0 的新数组。 |
【案例】翻转数组
1 | // 将数组 ['red', 'green', 'blue', 'pink', 'purple'] 的内容反过来存放 |
【案例】数组冒泡排序
1 | // 冒泡排序 |
数组常用方法
检测是否为数组
- instanceof 运算符,可以判断一个对象是否属于某种类型
- instanceof 的官方解释: instanceof 运算符用于检测构造函数的 prototype属性是否出现在某个实例对象的原型链上。
- Array.isArray() 用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法
1 | // 翻转数组 |
新增和删除元素
1 | // 1. push() 在数组的末尾 添加一个或者多个数组元素 push 推 |
1 | // 2. pop() 它可以删除数组的最后一个元素 |
1 | // 3. unshift 在数组的开头 添加一个或者多个数组元素 |
1 | // 4. shift() 它可以删除数组的第一个元素 |
【案例】筛选数组元素
- 有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面
1 | // 有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面 |
数组反转与排序
1 | // 1. reverse() 翻转数组,会修改原有的数组,返回的是经过翻转后的原数组 |
1 | // 2. sort() 数组排序(冒泡排序) |
获取元素的索引
1 | // 1. indexOf(数组元素) 作用就是返回该数组元素的索引号 从前面开始查找 |
1 | // 2. lastIndexOf(数组元素) 作用就是返回该数组元素的索引号 从后面往前开始查找 |
1 | // 3.如何判断数组中是否包含某个元素,返回值为 true / false |
【案例】数组去重
有一个数组 [‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。
案例分析:
- ① 目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去。
- ② 核心算法:我们遍历旧数组,然后拿着旧数组元素去查询新数组,如果该元素在新数组里面没有出现过,我们就添加,否则不添加。
- ③ 我们怎么知道该元素没有存在? 利用 新数组.indexOf(数组元素) , 如果返回时 -1 就说明新数组里面没有该元素
旧数组 [‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’]
新数组 [ ]
1 | // 数组去重 ['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b'] 要求去除数组中重复的元素。 |
转字符串与分隔元素
1 | // 数组转换为字符串 |
1 | // 2. join(分隔符) |
数组的拼接与截取
1 | // 1.1 concat() 拼接数组,返回的是一个经过拼接后的新数组 |
1 | // 2.1 slice() 数组截取 |
1 | // 3. splice() 删除数组元素 |
数组的解构赋值
- 01 数组的完全解构
1 | let arr = [1, 3, 5]; |
- 02 等号左边的格式必须和等号右边的格式一模一样, 才能完全解构
1 | // let [a, b, c] = [1, 3, 5]; // 1 3 5 |
- 03 在数组的解构赋值中, 左边的个数可以和右边的个数不一样
1 | let [a, b] = [1, 3, 5]; |
- 04 在数组的解构赋值中, 右边的个数可以和左边的个数不一样
1 | let [a, b, c] = [1]; |
- 05 在数组的解构赋值中,如果右边的个数和左边的个数不一样, 那么我们可以给左边指定默认值
1 | let [a, b = 666, c = 888] = [1]; |
- 06 在数组的解构赋值中, 如果左边的个数和右边的个数不一样, 那么设置的默认值会被覆盖
1 | let [a, b = 666] = [1, 3, 5]; |
- 07 在数组的解构赋值中, 还可以使用ES6中新增的扩展运算符来打包剩余的数据,返回的是一个数组
- 在数组的解构赋值中, 如果使用了扩展运算符, 那么扩展运算符只能写在最后
1 | // ES6中新增的扩展运算符: ... |
二维数组
1 什么是二维数组?
- 二维数组就是数组的每一个元素又是一个数组, 我们就称之为二维数组
2 如何操作二维数组?
- 2.1 如何从二维数组中获取数据
- 数组名称[二维数组索引]; 得到一个一维数组
- 数组名称[二维数组索][一维数组索引]; 得到一维数组中的元素
- 2.2 如何往二维数组中存储数据
- 数组名称[二维数组索引] = 一维数组;
- 数组名称[二维数组索引][一维数组索引] = 值;
- 2.1 如何从二维数组中获取数据
1 | let arr = [1, 3, 5]; // 一维数组 |
1 | // 遍历二维数组 |
数组的三个高阶方法
for of 实现元素处理
1 | // 定义一个数组 |
filter 方法
1 | // 需求1: 取出所有小于 100 的数字 |
map 方法
1 | // 需求2: 在需求1的结果的基础上,将数组的每一项都乘以 2 |
reduce 方法
1 | // 需求3: 在需求2的结果的基础上,将数组的每一项进行相加求和 |
对以上方法的综合写法
1 | // 定义一个数组 |
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自蜗牛浪迹天涯