数组

低码汇2022年6月18日
大约 3 分钟

数组是一种类列表对象,它的原型中提供了遍历和修改元素的相关操作。JavaScript 数组的长度和元素类型都是非固定的。因为数组的长度可随时改变,并且其数据在内存中也可以不连续。

我们可以用元素的索引(index)来获取数组的项。数组对象的属性和数组元素列表是分开存储的。

用途

存储列表型数据,可以是单类型数组,也可以是对象数组。

  • 可以用来管理list数据
  • 可以借助数组来实现队列、栈等数据结构。
  • 可以用二维数组实现excel数据存取。
  • 数组和对象结合实现DSL数据结构。
  • 适用于频繁查询,对存储空间要求不大,很少增加和删除的情况。

优缺点

优点: 按照索引查询元素速度快; 按照索引遍历数组方便。

缺点: 数组的大小固定后就无法扩容了(js没有这个要求); 数组只能存储一种类型的数据(js没有这个要求); 添加,删除的操作慢,因为要移动其他的元素。

常见操作

创建数组

let people = ['小明', '小强']

console.log(people.length)

通过索引访问数组元素

let first = people[0]
// 小明

let last = people[people.length - 1]
// 小强

遍历数组

people.forEach(function(item, index, array) {
  console.log(item, index)
})
// 小明 0
// 小强 1

添加元素到数组的末尾

let newLength = people.push('小小')
// ["小明", "小强", "小小"]

删除数组末尾的元素

let first = people.shift()
// ["小强"]

添加元素到数组的头部

let newLength = people.unshift('笑笑')
// ["笑笑", "小明", "小强"]

找出某个元素在数组中的索引

people.push('笑笑')
// ["小明", "小强", "笑笑"]

let pos = people.indexOf('小强')
// 1

通过索引删除某个元素

let removedItem = people.splice(pos, 1)

// ["小明", "小强"]

从一个索引位置删除多个元素

let people = ['小明', '小强', '小小', '笑笑']
console.log(people)
// ["小明", "小强", "小小", "笑笑"]

let pos = 1
let n = 2

let removedItems = people.splice(pos, n)

console.log(people)
// ["小明", "笑笑"] (原数组被改变)

console.log(removedItems)
// ["小强", "小小"]

复制一个数组

只对第一层做值复制,其他层若有数组或对象,只是引用复制

let shallowCopy = people.slice()
// ["小明", "小强"]

访问数组元素

JavaScript 数组的索引是从 0 开始的,第一个元素的索引为 0,最后一个元素的索引等于该数组的 长度 减 1。

如果指定的索引是一个无效值,JavaScript 数组并不会报错,而是会返回 undefined。

let arr = ['小明', '小强', '小小', ]
console.log(arr[0])              // logs '小明'
console.log(arr[1])              // logs '小强'
console.log(arr[arr.length - 1]) // logs '小小'
console.log(arr[arr.length]) // logs undefined

数组的浅复制与深复制

数组的浅复制是引用复制,修改时,新旧数组都会变。

// 浅复制
let arr = [1,2,3,4,5,6];
let newArr = arr;
newArr[0] = 12;
console.log(newArr[0]);  // 12
console.log(arr[0]);  // 12

深复制会创建一个新的数组,是值复制,修改数据时,相互之间不影响。

// 深复制
const copy = (arr1,arr2) => {
  for(let i = 0; i < arr1.length; i++){
    arr2[i] = arr1[i];
  }
}
let arr = [1,2,3,4,5,6];
let newAr = [];
copy(arr,newArr);
newArr[0] = 12;
console.log(newArr[0]);    // 12
console.log(arr[0]);    // 1

对象数组结合的深拷贝

深拷贝deepClone详解

可再次复习下数组的用途

本文地址:

参考

相关文章推荐

Loading...