JS的数组并不是典型的数组,是用 key 和 value 模拟出的。
典型的数组:
- 元素的数据类型相同。
- 使用连续的内存存储。
- 通过数字下标获取元素。
但JS的数组:
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标,可以有任何 key。
一、创建数组
1、新建
let arr=[1,2,3]
let arr2=new Array(1,2,3) //均创建数组 [1,2,3]
2、转化
let arr='1,2,3'.split(',') //split分隔
let arr2='123'.split('')
Array.from('123') //均创建数组 ["1","2","3"]
3、伪数组
伪数组就是像数组一样有 length 属性,也有 0、1、2、3 等属性的对象,看起来就像数组一样,但不是数组,例如
var fakeArray = {
"0": "first",
"1": "second",
"2": "third",
length: 3
} // 此例为伪数组
伪数组的原型链中并没有数组的原型。
4.合并 和 截取数组(concat 和 slice)
- 合并两个数组,得到新数组——
arr1.concat(arr2)。 - 截取一个数组的一部分(slice)
arr1.slice(1) //从第二个元素截取,但原数组不改变
arr2.slice(0) //复制、全部截取数组
//JS只提供浅拷贝
二、删元素
1、delete(不推荐)
let arr=['a','b','c']
delete arr['0']
// ——>[empty, "b", "c"]
// 数组的长度没改变,length 仍未3
delete删除元素不改变数组长度,删除后的数组——稀疏数组。
直接改length也可以删除元素,但是不推荐。
2、arr.shift()
arr.shift() ——删除头部的元素,并返回被删元素(数组length也改变)。
3、arr.pop()
arr.pop()——删除尾部的元素,并返回被删元素(数组length也改变)。
4、arr.splice
arr.splice(index,1)——删除下标index的一个元素arr.splice(index,1,'x')——删除下标index的一个元素,并在删除位置上添加'x'。arr.splice(index,1,'x','y')——删除下标index的一个元素,并在删除位置上添加'x' 'y'下标index是从0开始计数的。
例如:
let arr5='123'.split('') //arr5: ["1", "2", "3"]
arr5.splice(1,1) // arr5: ["1", "3"]
arr5.splice(0,1,'x') //arr5: ["x", "3"]
arr5.splice(1,1,'x','y') //arr5: ["x", "x", "y"]
三、查看元素
1、查看所有元素
Object.keys(arr)—— 查看所有的属性名Object.values(arr)—— 查看所有属性值
2、遍历数组
- 采用 for 循环,例如
let arr8=[1,5,7,3,56]
for (let i=0;i<arr8.length;i++){
console.log(`${i}:${arr8[i]}`)
}
- 采用 forEach
arr8.forEach(function(x,y){
console.log(`${y}:${x}`) //x——array[i], y——i
}) //与采用上面for循环的例子结果一样
关于 forEach函数,
function forEach(array,fn){
for(let i=0;i<array.length;i++){
fn(array[i],i,array) //将array[i],i,array值赋给了fn参数
} //一般array数组本身用不到
}
for 和 forEach 的区别:
- for 循环里可以用 break,continue等跳出循环,但是forEach不可以。
- forEach 是函数, for 是关键字。
3、查看单个属性
- (1)
arr[index]——查看单个元素 - (2)
arr[arr.length] === undefined和arr[-1] ===undefined属于索引越界。 - (3)
arr.indexOf(item)——查看某个元素是否在数组里,存在返回索引,否则返回 -1 。 - (4)根据条件查找元素——arr.find(条件)。 例如
arr.find(item=>item%2===0)——找第一个偶数。 - (5)根据条件查找元素的索引——arr.findIndex(条件)。例如
arr2.findIndex(item=>item%2===0)——找第一个偶数的索引。
四、增加元素
1、加元素
- (1)
arr.push(item1,item2)—— 在尾部加元素,修改arr,返回新长度。 - (2)
arr.unshift(item1,item2)——在头部加元素,修改arr,返回新长度。 - (3)
arr.splice(index,0,item1,item2)——在中间加元素,0 指不删除元素。
2、修改顺序
- (1)反转顺序——
arr.reverse()。 如何反转 'abcdef' ?
let s='abcdef'
s.split('').reverse().join('') //原数组没有改变,返回 "fedcba"
- (2)自定义顺序:
arr.sort((a,b)=> b-a)——从大到小排;arr.sort((a,b)=>a-b)——从小到大排。 可用下列代码便于理解:
arr.sort(function(a,b){
if (a>b){
return -1 //较大数排在前面
}else if(a===b){
return 0
}else{
return 1
}})
五、数组变换
- map —— n变n(一一映射)
- filter —— n变少
- reduce —— n变1 举例如下:
let arr=[1,2,3,4,5,6]
arr.map(item=>item*2)
// [2, 4, 6, 8, 10, 12]
arr.filter(item=>item%2===0)
// [2, 4, 6]
arr.reduce((sum,item)=>{return sum+item},0) //0是sum的初始值
// 21
arr.reduce((result,item)=>{return result.concat(item*item)},[])
// [1, 4, 9, 16, 25, 36]