一、什么是数组?
定义
JS的数据类型有number、string、boolean、symbol、null、undefined、object,其中object是唯一的复杂数据类型,数组是一种特殊的对象数据类型。JS其实没有真正的数组,只是用键值对去模拟的,所以JS数组实际上就是对象。
JS的数组不是典型的数组
典型数组的特点
- 元素的数组类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
JS数组的特点
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 通过字符串下标获取元素,这意味着数组有key,比如arr['name'],返回'luzhou'
二、新建数组
新建
- let arr = [1,2,3] (简写形式)
- let arr = new Array(1,2,3) (构造函数)
- let arr = new Array(3) (3:数组长度)
转化
- let arr = '1,2,3'.split(',') (使用字符串的split属性,返回[1,2,3])
- let arr = '123'.split('')
- Array.from('123') (将不是数组的对象变为数组)
伪数组
伪数组的原型链中没有数组对象的原型,数组的第一层原型指向Array.prototype,第二层原型指向Object.prototype
let arr = [1,2,3]
let arr2 = {0:'a',1:'b',2:'c',3:'d',length:4}
arr.__proto__ === Array.prototype //true
arr2.__proto__ === Array.prototype //false
arr.__proto__.__proto__ === Object.prototype //true
arr2.__proto__ === Object.prototype //true
合并数组
合并两个数组,得到一个新的数组
arr1.concat(arr2)
数组切片
- arr1.slice(1) (除了第一个元素,其他元素都给到新数组)
- arr1.slice(0) (以所有元素创建一个新数组,经常用于复制一个数组)
- JS只提供浅拷贝
二、删除元素
删除元素(不推荐)
- arr = [1,2,3]
- delete arr[0] (删除数组中的第一个元素,删除后数组的长度不变,arr[0]的值为empty)、
- arr.length = 2 (返回[1,2],数组长度变为2,不要随便修改length)
删除元素(推荐)
- arr.shift() (在arr上删除第一个元素)
- arr.pop() (在arr上删除最后一个元素)
- arr.splice(index,n,a,b,c) (修改原数组,从下标为index的元素开始,往后删除n个元素,包括arr[index],并添加a,b,c,也可以选择不添加任何元素)
三、查看所有元素
查看所有元素
查看数组的所有属性名(对象操作)
Object.keys(arr)
查看数组的所有属性值(对象操作)
Object.values(arr)
查看属性名和值(推荐,for循环是访问数组的常见形式)
方法一
for(let i=0;i<arr.length;i++){
console.log(`${i}:${arr[i]}`)
}
方法二(回调,遍历arr并在每次调用函数)
arr.forEach(function(item,index){
console.log(`${index}:${item}`)
})
查看单个元素
跟对象一样
- arr[index]
索引越界
- arr[arr.length] => undefined
- arr[-1] => undefined
查看某个元素是否在数组中
- arr.indexOf(item) //存在返回idnex,否则返回-1
使用条件查找元素
arr.find(item => item % 2 === 0) //返回第一个偶数
使用条件查看元素的索引
arr.findIndex(item => item % 2 === 0) //返回第一个偶数的索引
四、增加元素
在尾部增加元素
- arr.push(newItem) //修改arr,返回新长度
- arr.push(item1,item2)
在头部增加元素
- arr.unshift(newItem) //修改arr,返回新长度
- arr.unshift(item1,item2)
在中间增加元素
- arr.splice(index,0,'x') //在index处插入'x'
- arr.splice(index,0,'x','y')
五、修改数组
数组的反转
arr.reverse() //原数组被修改
字符串的反转
str.split('').reverse().join('') //'abc' => 'cba'
元素的排序
arr.sort((a,b) => a.key - b.key)
将数组arr的key属性对应的值作比较,并排序
六、数组变换
以下3个api都不会改变原数组
map
n变n,比如[1,2,3].map(item => item*item),返回[1,4,9],不改变原数组
filter
arr.filter(item => item % 2 === 0)
n变少,返回一个偶数数组
reduce
对一个数组的所有元素求和
方法一:循环
let sum = 0
for(let i=0;i<arr.length;i++){
sum = sum + arr[i]
}
console.log(sum)
方法二:reduce
arr.reduce((sum,item) => {return sum+item},0)
n变1,返回所有item的和
第一个参数是一个函数,第二个参数是结果的初始值
对一个数组的所有元素求平方
方法一:map
[1,2,3].map(item => item*item)
方法二:reduce
[1,2,3].reduce((result,item) => {return result.concat(item*item)},[])
筛选出数组中的偶数
方法一:filter
[1,2,3,4].filter(item % 2 === 0)
方法二:reduce
[1,2,3].reduce((result,item) => result.concat(item % 2 ? item : []),[])