数组
1.数组的概述
js中的数组是可以存放任意数据类型值的集合,数组的元素可以是任意数据类型,数组的长度可以动态调整。
2.数组的创建
- 字面量方式
由一对中括号“[ ]”包裹数组的元素,元素之间用逗号 “,” 隔开。
//元素可以是任意的数据类型
var arr = [123,"hello",function(){},null];
- 构造函数方式
通过Array() 构造函数来创建数组
/*如果传入的参数是一个number类型的整数,则代表创建的数组长度,如果是小数则会报错,
如果是其他类型的则会当成元素存进去。*/
var arr = new Array();
//创建一个长度为6的数组
var arr = new Array(6)
/*创建一个包含三个元素,长度为3的数组[ 3, 5, 'hello' ]。
(注:如果是字符串的参数,记得加引号)*/
var arr = new Array(3,4,'hello')
3.数组的访问
- 访问数组元素
数组变量名[索引],索引值从0开始,到数组长度length-1.
//如果索引值大于数组长度或者为负数,返回undefined。
var arr = [123,'hello'];
arr[0]; //访问数组的第一个元素,返回值为123
arr[3]; //undefined
//可以通过索引改变数组元素
arr[0] = 456; //把数组第一个元素123改成456
//如果索引大于数组长度,则会在指定的位置增加新的元素,并且数组长度变成索引值+1
arr[4] = 'world'; //[ 456, 'hello', <2 empty items>, 'world' ],数组长度变成5
4.数组API
4.1数组序列化
toString() 以字符串形式返回数组元素,并用逗号分隔
join() 以字符串形式返回数组元素,并用括号里指定的字符串分隔(括号里的分隔字符串要加引号)
4.2构造函数的方法
-
Array.isArray()
判断某个变量是否是一个数组对象 -
Array.from()
从类数组对象或者可迭代对象中创建一个新的数组实例。即把传进括号里的对象分解成单独的字符串,然后形成一个新的数组。
//[ '1', '2', '3', '4', '5', '6' ]
var Arr = Array.from("123456");
- Array.of()
根据一组参数来创建新的数组实例,支持任意的参数数量和类型。
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。 Array.of()方法基本上可以用来替代Array()或new Array().
4.3栈与队列方法
- Array.prototype.push()
向数组的末尾添加一个或多个元素,返回值是数组的新长度。
array.push(item1, item2, ..., itemX)
- Array.prototype.pop()
删除数组的最后一个元素,返回值是被删除的元素。
array.pop()
- Array.prototype.shift()
删除数组的第一个元素,返回值是第一个元素的值。
array.shift();
- Array.prototype.unshift()
向数组的开头添加一个或多个元素,返回值是数组的新长度。
array.unshift(item1,item2, ..., itemX)
注:以上四种方法都会改变原数组的长度。
排序方法
- Array.prototype.reverse()
用于颠倒数组中元素的顺序,返回值是颠倒后的数组。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse();//[ 'Mango', 'Apple', 'Orange', 'Banana' ]
- Array.prototype.sort()
用于对数组元素进行排序,默认按字母升序(Ascall编码)。如果是数字,则默认只比较第一个数字的大小进行升序。
array.sort(sortfunction)
如果想要进行真正的数字排序,则需要自己定义一个函数作为参数进行调用。
数字升序:
var arr = [5,80,60,9,10];
arr.sort(function(a,b){
return a-b;
})
//[ 5, 9, 10, 60, 80 ]
降序的话则把函数返回值改成 b-a就可以了。
因为无论是a>b还是b>a,return a-b 总能得到升序的结果,而 return b-a 总能得到降序的结果。
注:以上两种排序方式都会改变原数组,而不会创建新的数组副本。
4.5 操作方法
- Array.prototype.concat()
用于连接两个或者多个数组。
说白了,concat()方法就是在原数组的后面拼接上传入的参数。
array1.concat(array2,array3,...,arrayX)
参数是必需的,可以是数组对象,也可以是具体的值。返回值是一个新的数组。
- Array.prototype.slice()
用于从数组中返回选定的元素:[start,end)。
array.slice(start, end)
start:可选。开始选取的位置的索引值,如果为负数,则表示原数组的倒数第几个元素开始。
end:可选。结束选取的位置的索引值。如果没有该参数,则表示截取从start到数组结束的所有元素。如果为负数,则表示原数组的倒数第几个元素结束。
返回值:一个新的数组。包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
- Array.prototype.splice()
splice() 方法用于添加或删除数组中的元素。
注意: 这种方法会改变原始数组。
array.splice(index,howmany,item1,.....,itemX)
index:必需。在某个位置进行 添加/删除 的索引值,必须是数字。
howmany:可选。删除元素的个数,必须是数字。如果为0,则表示不删除元素;如果未规定,则表示删除从index开始到原数组末尾的所有元素。
item1, …, itemX:可选。要添加到数组的新元素。
返回值:返回由被删除的元素组成的新数组。如果没有被删除的元素,则返回一个空数组。
添加新的元素:
var Naruto = ['鸣人','佐助','卡卡西','鼬','柱间']
//从数组索引位置 2 开始,不删除元素,添加两个新的元素'带土','琳'
Naruto.splice(2,0,'带土','琳')
console.log(Naruto);//[ '鸣人', '佐助', '带土', '琳', '卡卡西', '鼬', '柱间' ]
移除数组的第三个元素,并在数组第三个位置添加新元素:
var Naruto = ['鸣人','佐助','卡卡西','鼬','柱间']
//在数组的第三个位置删除一个元素,并添加两个新的元素
Naruto.splice(2,1,'带土','琳')
console.log(Naruto);//[ '鸣人', '佐助', '带土', '琳', '鼬', '柱间' ]
从第三个位置开始删除数组后的两个元素:
var Naruto = ['鸣人','佐助','卡卡西','鼬','柱间']
Naruto.splice(2,2)
console.log(Naruto);[ '鸣人', '佐助', '柱间' ]
4.6 位置方法
- Array.prototype.indexOf()
从start处开始检索目标元素item的位置,没有指定start参数时则从头开始检索。
返回值:目标元素在数组中的位置,没有检索到则返回-1
array.indexOf(item,start)
- Array.prototype.lastIndexOf()
此方法用于返回目标元素在数组中最后出现的位置。
如果有参数start,则从start处,向着数组开头检索;如果没有,则从尾到头开始检索。
返回值:数组中该元素最后一次出现的索引,如未找到返回-1。
array.lastIndexOf(item,start)
4.7 迭代方法
- Array.prototype.every()
every()方法通过指定的函数检测数组中的所有元素,只有所有元素都符合条件才会返回true,否则返回false。
注:此方法不会改变原始数组,不会对空数组进行检测。
array.every(function(currentValue,index,arr){
//函数代码块
}, thisValue)
function(currentValue,index,arr):必需。自己定义的函数。
thisValue:可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。 如果省略了 thisValue ,“this” 的值为 “undefined”。
currentValue:必需。当前数组元素的值。
index:可选。当前元素的索引值。
arr:可选。当前元素属于的数组对象。
- Array.prototype.some()
some()方法用于检测数组中是否存在满足指定条件的元素。
此方法会依次检测每个数组,但只要有一个元素满足条件,则返回true,并停止检测,否则返回false。
注:不会对空数组检测,不改变原数组。
array.some(function(currentValue,index,arr),thisValue)
- Array.prototype.filter()
filter()方法用于把符合条件的元素组成一个新的数组。
注:不检测空数组,不改变原数组。
array.filter(function(currentValue,index,arr), thisValue)
返回值:符合条件的元素组成的数组。如果没有符合条件的元素则返回空数组。
- Array.prototype.map()
map()方法,把元素经过函数处理过后的值(eg:函数把元素开平方,求和),组成新的数组。
注:不检测空数组,不改变原数组。
array.map(function(currentValue,index,arr), thisValue)
返回值:一个新的数组。
- Array.prototype.forEach()
forEach()方法可以遍历数组的每一个元素,然后把元素传递给回调函数。
注:forEach() 对于空数组是不会执行回调函数的。
array.forEach(function(currentValue, index, arr), thisValue)
返回值:undefined
forEach()与map()差不多,但是前者是没有返回值的
- 不改变原数组的方法
join()—把数组的所有元素放入一个字符串。
toString()—把数组转换为字符串,并返回结果。
concat()—连接两个或更多的数组,并返回结果。
every()—检测数组元素的每个元素是否都符合条件。
some()—检测数组元素中是否有元素符合指定条件。
filter()—检测数组元素,并返回符合条件所有元素的数组。
indexOf()—搜索数组中的元素,并返回它所在的位置。
lastIndexOf()—返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
map()—通过指定函数处理数组的每个元素,并返回处理后的数组。
slice()—选取数组的的一部分,并返回一个新数组。
valueOf()—返回数组对象的原始值。
- 改变原数组的方法
pop()—删除数组的最后一个元素并返回删除的元素。
push()—向数组的末尾添加一个或更多元素,并返回新的长度。
shift()—删除并返回数组的第一个元素。
unshift()—向数组的开头添加一个或更多元素,并返回新的长度。
reverse()—反转数组的元素顺序。
sort()—对数组的元素进行排序。
splice()—用于插入、删除或替换数组的元素。