=== 什么是数组 ===
数组是数据的 有序列表 。
创建数组的基本方式有 两种 。
第一种是使用 Array 构造函数:var colors = new Array();
创建数组的第二种基本方式是使用数组字面量表示法:var colors = [“red”, “blue”, “green”];
=== 检测数组的方法 ===
1》通过 instanceof 来判断:value instanceof Array;
2》通过 Array.isArray() 方法来判断;
=== 数组的方法 ===
一共总结数组常见的 22 种方法!
其中 7 种会改变原数组值:push()、pop()、shift()、unshift()、reverse()、sort()、splice()
15 种不会改变原数组的值:toString()、toLocaleSting()、valueOf()、join()、concat()、slice()、indexOf()、lastIndexOf()、every()、filter()、forEach()、map()、some()、reduce()、reduceRight()
1. 转换方法(toString、toLocaleSting、valueOf()、join)(不会修改原数组!)
所有对象都会有 toString、toLocaleSting、valueOf()方法。
toString、toLocaleSting 方法会将数组转换成以逗号(,)分割的字符串。
join()接收一个参数,将数组转换为字符串,并以这个参数作分割。
2. 栈方法 (修改原数组!)
栈是一种 LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入 (叫做推入) 和移除 (叫做弹出),只发生在一个位置——( 栈的顶部 )。ECMAScript 为数组专门提供了 push() 和 pop()方法,以便实现类似栈的行为。
因为是栈 后进先出 ,而且 推入 / 弹出 都是发生在栈的顶部。因此数组的尾部实际是存放在栈的顶部,所以 push()(后增方法 )添加在数组尾部,就是添加在栈的顶部。pop 方法删除数组 尾部一位数据 也就是在栈顶部删除 最新数据,满足后入先出去。
3. 队列方法(修改原数组!)
队列数据结构的访问规则是 FIFO(First-In-First-Out,先进先出)。队列在列表的 末端添加项,从列表的前端移除项 。
结合使用 shift()和 push()方法,可以像使用队列一样使用数组。
因为队列是先进先出,所以 数组的尾部 就对应着 队列末端 ,所以通过 push 方法在数组尾部添加数据就是在队列末端添加。在使用shift 方法在 数组顶部移除 一位数据就是在队列前端移除。
ECMAScript 还为数组提供了一个 unshift()方法。顾名思义,unshift()与 shift()的用途相反: 它能在数组 前端添加任意个项 并返回新数组的长度。因此,同时使用 unshift()和 pop()方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项。
4. 重新排序方法 (修改原数组!)
数组中已经存在两个可以直接用来重排序的方法:reverse()和 sort()。
reverse 反转数组,sort 按升序排列数组项——即最小的值位于最前面 。sort() 方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串(javascript 字符串在进行大于 (小于) 比较时,会根据第一个不同的字符的 ascii 值码进行比较,当数字 (number) 与字符串 (string) 进行比较大小时,会强制的将数字 (number) 转换成字符串 (string) 然后再进行比较),以确定如何排序。
sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等 则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。
5. 操作方法
concat (不修改原数组!):先创建当前数组一个 副本 ,然后将接收到的参数 添加到这个副本的末尾,最后返回 新构建的数组 。在没有给 concat() 方法传递参数的情况下,它只是 复制当前数组并返回副本。如果传递给 concat()方法的是一或多个数组,则该方法会将这些数组中的 每一项都添加到结果数组中。
slice() (不修改原数组!): 基于当前数组中的一或多个项创建一个新数组。slice()方法可以 接受一或两个参数,即要返回项的 起始 和结束 位置。在只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组 末尾的所有项 。如果有两个参数,该方法返回 起始 和结束位置 之间的项, 但 不包括结束位置的项。
起始值大于结束值:返回【】;
负数则加上 数组长度 来确定坐标 slice(-2,-1) === slice(1,2);
splice (修改原数组!): 有很多种用法:
删除 : 可以删除任意数量的项,只需指定 2 个参数: 要删除的 第一项 的位置和 要删除的项数 。例如,splice(0,2) 会删除数组中的前两项。
插入 : 可以向指定位置插入任意数量的项,只需提供 3 个参数: 起始位置 、 要删除的项数 (0) 和要插入的项 。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如,splice(2,0,”red”,”green”) 会从当前数组的位置 2 开始插入字符串 ”red” 和 ”green”。
替换 : 可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数: 起始位置 、 要删除的项数 和要插入的任意数量的项 。插入的项数不必与删除的项数相等。例如,splice (2,1,”red”,”green”) 会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串 ”red” 和 ”green”
6. 位置方法 (不修改原数组!)
indexOf()和 lastIndexOf()。这两个方法都接收两个参数:要查找的项 和(可选的)起点位置的索引 。其中,indexOf() 方法从数组的开头 (位置 0) 开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。内部使用 === 进行比较。
7. 迭代方法 (不修改原数组!)
ECMAScript5 为数组定义了 5 个迭代方法。每个方法都接收 两个参数 : 要运行的函数 、 运行该函数的作用域对象 (可选的)(影响 this 的值)。
传入这些方法中的函数会接收三个参数:数组项的值 、 该项在数组中的位置 和数组对象本身 。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。
every(): 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。filter(): 对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
forEach(): 对数组中的每一项运行给定函数。这个方法 没有返回值。
map(): 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
some(): 对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
8. 归并方法(不修改原数组!)
reduce()和 reduceRight()。这两个方法都会迭代数组的所有项,然后构建一个 最终返回的值 。其中,reduce() 方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()相反。
接收 两个参数 : 要调用的函数 、 作为归并基础的初始值 (可选)
函数接收 4 个参数:前一个值 、 当前值 、 项的索引 和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第 一个参数是数组的第一项,第二个参数就是数组的第二项。