这里写目录标题
定义
数组是存放在连续内存空间上的相同类型数据的集合。
连续内存空间
在C、C++、Java 等语言中数组的实现是要求数组固定长度的,在数组的定义中我们也可以知道,因为要求数组在空间中是连续存储的,所以数组就肯定是定长的。
因为内存不知道数组还要不要继续存放,还要使用多长的空间,如果不是固定长度,那么内存中位于数组之后的区域会没办法分配。
相同类型数据
因为数组长度是固定的,如果不是相同数据类型,一会存 int ,一会存String ,两种不同长度的数据类型,不能保证各自存放几个,这样有悖固定长度的规定,所以也要是相同的数据类型。
JS中的数组特殊的地方
但是如下图所示,在JS中数组好像不遵循一般意义上的数组定义,既可以存储不同类型的数据,也可以随意改变长度,增删元素。
原因
实际上是JS的源码在底层上对做了一层封装,这里博主就不具体具体展开对源码进行分析了,具体可以看这个链接: 探究JS V8引擎下的“数组”底层实现
在这里大家只需要知道,JS中的数组和普通意义上的数组不同,可以定义不同类型并且能随意改变长度,这也是JS中数组有那么多API方法的原因,接下来我会详细介绍JS数组的API
数组常用API(push prp shift unshift splice sort concat)
创建数组
// 创建数组
let arr = new Array(1,2,3)
let arr2 = [3,4,5]
接下来的操作都是对这里创建的 arr 进行的
1,push (在数组末尾添加一个元素)
arr.push(4) // 1,2,3,4
2,prp (弹出数组末尾的一个元素)
arr.prp() // 返回值 4 原数组 1,2,3
3,shift(在数组前弹出一个元素)
arr.shift() // 返回值 1 原数组 2,3
4,unshift(在数组前添加一个元素)
arr.unshift(1) // 1,2,3
5,splice(在任意位置插入和删除)
arr.splice(0,2,5) //从下标0开始删除两个元素并添加 5 //5,3
6,sort(排序数组)
let arr = [3,2,4,6,5];
arr.sort((x,y) => x - y) //正序排序 2,3,4,5,6
arr.sort((x,y) => y - x) //倒序排序 6,5,4,3,2
//也可以对对象进行排序
let arr = [
{
name:'张三',
age:100
},
{
name:'李四',
age:18
},
{
name:'王五',
age:20
}
]
arr.sort((x,y)=>x.age-y.age) //对对象进行以age的正序排序
7,concat(合并数组)
let arr1 = [1,2,3]
let arr2 = [4,5,6]
arr1.concat(arr2) //1,2,3,4,5,6
arr1.concat(arr2,7,8,9) //1,2,3,4,5,6,7,8,9
8,slice(分割 从下标为几开始分割几个)
let arr = [11,12,13,11]
console.log(arr.slice(1)); //12,13,11 只写一个就分割到最后
console.log(arr.slice(0,3)); //11,12,13
console.log(arr.slice(-2)); //13,11 如果是负数 就是从下标为倒几开始,分割几个
数组其他API
迭代方法 (every, some, filter, map, forEach, reduce,entries)
1, every (数组所有都满足才返回true 否则 false)
let arr = [11,12,13,14]
console.log(arr.every(item => item > 10)); //true
2, some(数组有一个满足就返回 true 否则false)
console.log(arr.some(item => item > 13)); //true
3, filter(过滤 返回符合条件的元素)
console.log(arr.filter(item => item > 12)); // 13,14
4, map(映射 方法用于数组转换。它接受另一个自定义函数作为参数,并在每个数组项上应用该函数。)
console.log(arr.map(item => item + 'ccy')); //数组中每个元素都执行方法体
11ccy,12ccy。。。
5, forEach(遍历)
arr.forEach( item => {
//11, 12 ,13, 14
console.log(item);
} )
// 返回索引值的遍历
arr.forEach( (item,index) => {
//11 0 , 12 1 , 13 2 , 14 3
console.log(item,index);
} )
6, reduce(累加,累乘 之类的操作)
console.log(arr.reduce( (item1,item2) => item1 + item2 ));
//50 过程 11 + 12 = 23 -> 23 + 13 = 36... item1是得出的那个数 item2为下一个数组的数
console.log(arr.reduce( (item1,item2) => item1 * item2 )); //24024
7, entries(迭代器对象)
for(let i of arr.entries()){
//[0, 11],[1, 12],[1, 12],[1, 12]
console.log(i);
}
for(let i of arr.keys()){
//0,1,2,3
console.log(i);
}
for(let i of arr.values()){
//11,12,13,14
console.log(i);
}
搜索(indexOf ,lastIndexOf , find , findIndex , findLast ,findLastIndex ,includes)
// let arr = [11,12,13,14]
1, indexOf(从头开始 包不包含某数,包含返回第一次遇见的索引 不包含返回-1)
console.log(arr.indexOf(15)); //-1
console.log(arr.indexOf(11)); //0
2, lastIndexOf(从最后开始 包不包含某数,包含返回第一次遇见的索引 不包含返回-1)
console.log(arr.indexOf(15)); //-1
console.log(arr.indexOf(11)); //3
3, includes(包不包含某数,包含返回true 不包含返回false)
console.log(arr.includes(15)); //false
console.log(arr.includes(14)); //true
4, find(找 返回符合添加的第一个数)
console.log(arr.find(item => item > 11)); //12
5, findLast(从后往前找 返回符合添加的第一个数)
console.log(arr.findLast(item => item < 14)); //13
6, findIndex,findLastIndex(同上但返回索引)
console.log(arr.findIndex(item => item > 11)); //1
console.log(arr.findLastIndex(item => item < 14)); //2