1.数组的常用方法
* 数组的常用方法
*
* 1. push
* * 语法: 数组.push(数据)
* * 作用: 向数组末尾添加数据
* * 返回值: 追加数据后, 数组最新的长度(length)
*
* 2. pop
* * 语法: 数组.pop()
* * 作用: 删除数组最后一条数据
* * 返回值: 被删除的数据
*
* 3. unshift
* * 语法: 数组.unshift(数据)
* * 作用: 向数组开头添加数据
* * 返回值: 添加数据后, 数组最新的长度(length)
*
* 4. shift
* * 语法: 数组.shift()
* * 作用: 删除数组第一条数据
* * 返回值: 被删除的数据
*
* 5. reverse
* * 语法: 数组.reverse()
* * 作用: 反转数组
* * 返回值: 反转后的数组
*
* 6. sort
* * 语法1: 数组.sort()
* * 作用: 会将数据转换为 字符串后, 一位一位的对比
* * 语法2: 数组.sort(function (a, b) {return a - b})
* * 作用: 会按照数字大小升序排列
* * 语法3: 数组.sort(function (a, b) {return b - a})
* * 作用: 会按照数字大小降序排列
*
* * 返回值: 排序后的数组
*
* 7. splice
* * 语法1: 数组.splice(开始索引, 多少个)
* * 作用: 截取数组部分内容
* * 语法2: 数组.splice(开始索引, 多少个, 插入的数据1, 插入的数据2, 插入的数据3...)
* * 作用: 截取数组部分内容, 并插入新的数据
*
* * 返回值: 截取出来的部分内容 组成的 数组
*
* 数组的方法 能够改变原数组的 就只有上边说的 7 个
*
*
* 8. slice
* * 语法: 数组.slice(开始索引, 结束索引)
* * 参数:
* + 包前不包后: 包含开始索引位置的数据, 不包含结束索引位置的数据
* + 不写开始索引, 默认是0; 不写 结束索引, 默认是 数组的length
* + 参数支持写负数, 表示倒数第几个, 其实就是 length + 负数
* * 作用: 截取数组部分内容
* * 返回值: 截取出来的部分内容组成的新数组
*
* 面试题: 数组中有两个方法, splice 与 slice, 你能描述一下他们两个的区别吗?
* 1. 参数含义不同, 然后介绍一下 参数哪里不同
* 2. splice 会改变原数组, 而 slice 不会
2.常用的方法2
* 9. concat
* * 语法: 原始数组.concat(数组1, 数组2, ...., 数据1, 数据2, ....)
* * 作用: 进行数据拼接, 把数组...数据之类的小括号里的内容, 拼接在原始数组中
* * 返回值: 拼接好的数组
*
* 10. join
* * 语法: 数组.join('连接符')
* * 作用: 使用 "连接符", 把数组内的每一个数据连接成一个字符串 (不写连接符, 默认使用的是 逗号)
* * 返回值: 连接好的字符串
*
* 11. indexOf
* * 语法1: 数组.indexOf(要检查的数据)
* * 作用: 从前到后(从左到右) 检查该数据第一次在该数组内出现 索引
* * 语法2: 数组.indexOf(要检查的数据, 开始索引)
* * 作用: 在开始索引的位置, 按照从左到右的顺序, 检查该数据第一次在该数组内出现的 索引
* * 返回值: 找到数据的情况下, 会将该数据第一次出现的下标(索引)返回
* 没找到的情况下, 会直接返回一个 -1
*
* * 备注: 开始索引不写的时候 默认是0
*
* 12. lastIndexOf
* * 语法1: 数组.lastIndexOf(要检查的数据)
* * 作用: 从后向前(从右向左), 检查该数据第一次在该数组内出现的 索引
* * 语法2: 数组.lastIndexOf(要检查的数据, 开始索引)
* * 作用: 在开始索引的位置, 按照从右向左的顺序, 检查该数据第一次在该数组内出现的 索引
* * 返回值: 找到数据的情况下, 返回第一次出现的下标(索引)
* 没找到的情况下, 直接返回一个 -1
3.数组遍历的常用方法
* 数组遍历的常用方法
*
* 1. forEach
* * 语法: 数组.forEach(function (item, index, origin) {})
* * item: 数组的每一项 的值
* * index: 数组的每一项 对应的下标
* * origin: 原始数组 (了解即可, 一般没人用)
* * 作用: 遍历数组
* * 返回值: 该方法永远没有返回值 (undefined)
*
* 2. map
* * 语法: 数组.map(function (item, index, origin) {}) 三个参数的意义与 forEach 相同
* * 作用: 映射数组
* * 返回值: 返回一个和原数组长度相同的数组, 但是内部数据可以经过我们的映射加工
* * 映射加工: 就是在函数内 以 return 的形式书写
*
* 有一道面试题: 数组常用的遍历方法中, 有一个forEach 和 一个 map, 这两个方法有什么区别?
* 1. forEach 的作用是用来遍历数组, 而 map 的作用是用来映射数组
* 2. forEach 没有返回值, 而 map 是可以有返回值的
*
* 3. filter
* * 语法: 数组.filter(function (item, index, origin) {}) 三个参数的意义与 forEach 相同
* * 作用: 过滤数组
* * 返回值: 返回一个新数组, 内部存储的是原始数组过滤出来的部分内容
* * 过滤条件: 过滤条件以 return 的形式书写
*
* 4. find
* * 语法: 数组.find(function (item, index, origin) {}) 三个参数的意义 与 forEach 相同
* * 作用: 在数组内查找满足条件的第一项
* * 返回值: 找到的数据, 如果没找到返回的是 undefined
* * 查找条件以 return 的形式书写
*
* 5. findIndex
* * 语法: 数组.findIndex(function (item, index, origin) {}) 三个参数的意义 与 forEach 相同
* * 作用: 在数组内查找满足条件的第一项 的下标
* * 返回值: 找到的数据 的下标, 如果没找到返回的是 -1
* * 查找条件以 return 的形式书写
*
* 6. some
* * 语法: 数组.some(function (item, index, origin) {}) 三个参数的意义 与 forEach 相同
* * 作用: 判断数组内是否有一个满足条件
* * 返回值: 一个布尔值 true/false
* * 判断条件以 return 的形式书写
*
* 7. every
* * 语法: 数组.every(function (item, index, origin) {}) 三个参数的意义 与 forEach 相同
* * 作用: 判断数组内是否全都满足条件
* * 返回值: 一个布尔值 true/false
* * 判断条件以 return 的形式书写
*
* 8. reduce
* * 语法: 数组.reduce(function (prev, item, index, origin) {}, init)
* * prev: 表示初始值或者上一次的运算结果
* * item: 表示数组的每一项 的值
* * index: 表示数组的每一项 的下标(索引)
* * origin: 原始数组
* * 作用: 用来实现叠加效果
* * 返回值: 最终叠加的结果
* * 注意:
* + 叠加条件以 return 的形式书写
* + prev 第一次的值, 如果你传递了 init, 就是 init 的值, 如果没有传递 init, 那么就是 数组[0] 的值
* + 如果传递了 init, 循环执行 数组.length 次, 如果没有传递 init, 循环执行 数组.length - 1 次