Logo
Section 1 / 25

数组

在本节课中,我们将学习 JavaScript 中数组及其方法的定义!

导入

数组

在本节课中,我们将学习 JavaScript 中数组及其方法的定义!

简介

在 JavaScript 中,数组是一种有序的异构元素序列。换句话说,数组可以存储不同类型的数据。

注意: 数组是 JavaScript 中一种特殊的对象。

初始化数组

1var ExampleList = [3.14159, 'apple', 23] 2var EmptyList = [] 3console.log(ExampleList) 4console.log(EmptyList)

因此,数组可以同时容纳整数、字符串、字符、函数,以及几乎所有其他数据类型,包括其他数组!请看下面的例子。anotherArray 包含两个数组、一个字符串和一个函数!元素可以通过方括号进行访问或“索引”。数组的第一个元素通过 0 访问(如第 8 行所示),第二个元素通过 1 访问,依此类推。数组的索引从 0 开始。

1var anArray = [2, 'PageFlux', 'A'] 2function foo() 3{ 4 console.log('Hello from foo()!'); 5} 6var anotherArray = [anArray, 'JavaScript', foo, ['yet another array']] 7 8console.log(anotherArray[0]) // 'anArray' 的元素 9console.log(anotherArray[0][1]) // 'anArray' 的第二个元素 10console.log(anotherArray[1]) // 'JavaScript' 11console.log(anotherArray[3]) // 'yet another array' 12 13// 你也可以调用数组中的函数! 14anotherArray[2]() // 'Hello from foo()!'

注意: 在 JavaScript 中,JS 引擎会尝试为数组元素使用连续的内存位置以优化操作。然而,如果我们进行诸如留空或添加属性等操作,引擎就必须将数组视为对象来处理。如果我们按照数组应有的方式使用它,可以认为它类似于 C++ 中的数组。但在某些情况下,我们可能会以 JavaScript 特有的方式发挥数组的功能,此时数组就变成了对象,因此我们对代码运行时间的假设也需要相应调整。

重要的数组函数

让我们来看看一些有用的内置 JavaScript 数组函数。不过要提醒一下,不要用这些函数来替代面试中的回答。例如,如果被要求排序数组,不要直接使用 sort() 函数来作答!

push() 函数

此函数用于将单个元素添加到数组末尾。

1var array = [1, 3, 5, 'seven'] 2console.log(array) 3array.push(9) 4console.log(array)

push() 操作的时间复杂度为 O(1)O(1),因为我们只需更新数组的 length 并添加新元素。

pop() 函数

返回并移除数组末尾的元素。

1var array = [1, 3, 5, 'seven'] 2console.log(array) 3array.pop() 4console.log(array)

pop() 操作的时间复杂度为 O(1)O(1),因为我们只需更新数组的 length 并移除最后一个索引。

shift() 函数

返回并移除数组开头的元素。请自行尝试!

1var array = [1, 3, 5, 'seven']; 2console.log(array.shift()) 3console.log(array)

shift() 操作的时间复杂度为 O(n)O(n),因为我们需要移除索引为 0 的元素,将所有后续元素向左移动,然后更新数组长度。

unshift(value) 函数

将指定元素插入到数组开头。

1var array = [1, 3, 5, 'seven']; 2console.log(array); 3array.unshift('JavaScript'); 4console.log(array);

unshift() 操作的时间复杂度为 O(n)O(n),因为我们需要更新数组长度,将所有元素向右移动,然后在索引 0 处添加新元素。

delete 关键字

可以在 JavaScript 中使用 delete 删除数组元素。但使用 delete 会在数组中留下未定义的空洞,因此建议使用 shift() 或 pop() 方法。

1var array = [1, 3, 5, 'seven'] 2console.log(array); 3delete array[3] 4console.log(array);

delete 只移除指定索引处的元素,不会移动其他元素,因此不存在 O(n)O(n) 的元素搬移;它的代价来自在数组中留下空洞,可能降低后续操作的性能。

reverse() 函数

此函数用于反转数组。使用方式为 array.reverse()。

1var array = [1, 3, 5, 'seven'] 2console.log(array); 3array.reverse() 4console.log(array);

reverse() 函数的时间复杂度为 O(n)O(n),因为我们必须遍历数组的所有元素。

splice() 函数

splice() 函数可用于添加或删除元素。

第一个参数是插入新元素的索引位置。

第二个参数是要删除的元素数量。如果不希望删除任何元素,只需将第二个参数设为 0。

其余参数是要添加的新元素。

1var array = [1, 3, 5, 'seven', 10] 2console.log(array); 3// 添加新元素 4array.splice(2, 0, 'four'); 5console.log(array); 6// 删除元素 7array.splice(2, 3); 8console.log(array); 9// 同时添加和删除元素 10array.splice(2, 1, 'ten', 8); 11console.log(array);

splice() 函数的时间复杂度为 O(n)O(n)。由于 splice() 直接在原数组上进行增删操作,因此最坏情况下需要移动 n−1n-1 个元素。

slice() 函数

slice() 函数可用于从数组中截取一部分内容并生成一个新数组。

第一个参数是截取开始的索引位置。

第二个参数是截取结束的索引位置(不包含该位置)。如果省略第二个参数,则新数组包含从第一个参数开始到数组末尾的所有元素。

1var array = [1,'two',3,4,5,'six','seven',8,'nine',10] 2console.log(array); 3// 仅使用第一个参数进行截取 4var newArray = array.slice(4); 5console.log(newArray); 6// 使用两个参数进行截取 7var newArray2 = array.slice(4,7); 8console.log(newArray2);

slice() 函数的时间复杂度为 O(n)O(n)。因为 slice() 会从起始位置到结束位置创建一个新数组,因此最坏情况下需要复制数组中的所有元素。

concat() 函数

concat() 函数如其名称所示,用于连接数组,并创建一个新数组,不会影响原始数组。

你可以通过向 concat() 函数传入任意多个数组作为参数来合并它们。

1var array = [1,'two',3,4,5]; 2var array2 = ['six','seven',8,'nine',10] 3console.log(array); 4console.log(array2); 5// 合并 array 和 array2 6var mergedArray = array.concat(array2) 7console.log(mergedArray) 8 9// 合并另外两个数组 10mergedArray = mergedArray.concat([11,'twelve'], [13,14,15]) 11console.log(mergedArray)

concat() 函数的时间复杂度为 O(m+n)O(m+n),其中 m 是第一个数组的大小,n 是第二个数组的大小。concat() 会创建一个大小为 m+n 的新数组,并逐个复制两个数组的元素到新数组中。

for...of 语句

for...of 语句用于遍历可迭代对象,如数组和类数组对象。

1var array = [1,'two',3,4,5, 'six','seven',8,'nine',10] 2 3for(let ele of array){ 4 console.log(ele) 5}

for...of 的时间复杂度为 O(n)O(n),其中 n 是数组中的元素数量。

注意: 这些内置函数的时间复杂度是基于假设计算得出的。

复杂度度量简介

var、let 和 const 的区别