一、检测数组
一个经典的问题:如何判断一个对象是不是数组,在只有一个网页(即只有一个全局作用域)的情况下,使用instanceof
操作符即可:
if(value instanceof Array){
//操作数组
}
但如果网页里有多个框架,则可能涉及两个不同的全局执行上下文,因此就会有两个不同版本的Array
构造函数,如果要把数组从一个框架传给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组。
为解决这一问题,就有了Array.isArray()
方法,它用于确定一个值是否为数组,而不用管它是在哪个全局执行上下文中创建的:
if(Array.isArray(value)){
//操作数组
}
二、数组的增删
splice()
方法很强大,增删改全能,它通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被删除的内容(如果没有删除元素,则返回空数组)。此方法会改变原数组。splice()
方法的3种用法:
- 删除。需要给**
splice()
**传2个参数:要删除的第一个元素的位置和要删除的元素数量。 - 插入。需要给**
splice()
**传3个参数:开始位置、0(要删除的数量)和要插入的元素。 - 替换。同样要传3个参数:开始位置、要删除的数量和要插入的任意多个元素。
1. 删
-
**shift()**
方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。 -
**pop()**
方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
2. 增
-
**unshift()**
方法将一个或多个元素添加到数组的开头,并返回该数组的新长度。此方法更改数组的长度。 -
**push()**
方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
三、排序方法
-
**reverse()**
方法将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。 -
**sort()**
方法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16
代码单元值序列时构建的,但这在多数情况下都不是最合适的。为此,sort()
方法可以接收一个比较函数,用于判断哪个值应该排在前面。如:arr.sort((a,b)=>a-b))
四、操作方法
-
**concat()**
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。 -
**slice()**
方法返回一个新的数组对象,这一对象是一个由begin(开始索引)
和end(结束索引)
决定的原数组的浅拷贝(包括begin
,不包括end
)。原始数组不会被改变。
五、搜索和位置方法
1. 按严格相等搜索:
**indexOf()**
方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。lastIndexOf()
方法返回指定元素在数组中的最后一个的索引,如果不存在则返回 -1。**includes()**
方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回true
,否则返回false
。
这些方法都接收两个参数:要查找的元素和一个可选的起始搜索位置。indexOf()
和includes()
方法从数组第一项开始往后搜索,而lastIndexOf()
则从最后一项往前搜索。
2. 按断言函数搜索:
-
**find()**
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined
。 -
**findIndex()**
方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。
六、迭代方法
有5个迭代方法,每个方法接收两个参数:以每一项为参数运行的函数,以及可选的作为函数运行上下文的作用域对象(影响函数中this
的值)。这些方法都不改变原数组。
-
every()
:对数组每一项都运行传入的函数,如果对每一项函数都返回true
,则这个方法返回true
。 -
filter()
:对数组每一项都运行传入的函数,函数返回true
的项会组成数组之后返回。 -
forEach()
:对数组每一项都运行传入的函数,没有返回值。 -
map()
:对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。 -
some()
:对数组每一项都运行传入的函数,如果有一项函数都返回true
,则这个方法返回true
。
七、转换方法
join()
方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。toString()
返回一个字符串,表示指定的数组及其元素。
参考资料:Array