【JavaScript】数组

366 阅读3分钟

一、什么是数组?

定义

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 : []),[])

面试题