# 数组

几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构。JavaScript里也有数组类型,尽管它的第一个版本并没有支持数组。

数组存储一系列同一种数据类型的值。虽然在 JavaScript 里,也可以在数组中保存不同类型 的值,但我们还是遵守最佳实践,避免这么做(大多数语言都没这个能力)。

# 一、为什么用数组

假如有这样一个需求:保存所在城市每个月的平均温度。可以这么做:

const averageTempJan = 31.9; 
const averageTempFeb = 35.3; 
const averageTempMar = 42.4; 
const averageTempApr = 52; 
const averageTempMay = 60.8; 

当然,这肯定不是最好的方案。按照这种方式,如果只存一年的数据,我们能管理 12 个变量。若要多存几年的平均温度呢?

幸运的是,我们可以用数组来解决,更加简洁地呈现同样的信息。

const averageTemp = []; 
averageTemp[0] = 31.9; 
averageTemp[1] = 35.3; 
averageTemp[2] = 42.4; 
averageTemp[3] = 52; 
averageTemp[4] = 60.8; 

# 二、创建和初始化数组

用 JavaScript 声明、创建和初始化数组很简单,就像下面这样:

  1. {1},数组构造器
  2. {2},传递数组的长度
  3. {3},传递数组的元素
let daysOfWeek = new Array(); // {1} 
daysOfWeek = new Array(7); // {2} 
daysOfWeek = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 
'Thursday', 'Friday', 'Saturday'); // {3} 

最简单也是最常用的方式:

let daysOfWeek = []; 
let daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
'Friday', 'Saturday']; 

# 三、添加元素

在数组末尾插入元素

在 JavaScript 中,数组是一个可以修改的对象。如果添加元素,它就会动态增长。

arr[arr.length] = 1;
arr.push(1);
arr.push(2, 3);

在数组开头插入元素

现在,我们希望在数组中插入一个新元素,不像之前那样插入到最后,而是放到数组的开头。为了实现这个需求,首先要腾出数组里第一个元素的位置,把所有的元素向右移动一 位。下面的代码表现了这段逻辑。

Array.prototype.insertFirstPosition = function (value) {
    for (let i = this.length; i >= 0; i--) {
        this[i] = this[i - 1];
    }
    this[0] = value;
};
numbers.insertFirstPosition(-1);

unshift 方法就是拥有上述能力的方法,可以直接把数值插入数组的开头(此方法背后的逻辑和 insertFirstPosition 方法的行为是一样的)。

numbers.unshift(-2); 
numbers.unshift(-4, -3);

# 四、删除元素

目前为止,我们已经学习了如何给数组的开始和结尾位置添加元素。下面来看一下怎样从数 组中删除元素。

# 4.1 从数组末尾删除元素

要删除数组里最靠后的元素,可以用 pop 方法。

pop和push就可以用来模拟栈的入栈和出栈

# 4.2

现在,数组输出的数是4 到 12,数组的长度是 17。 3.4.2 从数组开头删除元素 如果要移除数组里的第一个元素,可以用下面的代码。 for (let i = 0; i < numbers.length; i++) { numbers[i] = numbers[i + 1]; } 下图呈现了这段代码的执行过程。 我们把数组里所有的元素都左移了一位,但数组的长度依然是 17,这意味着数组中有额外 50 第 3 章 数组 的一个元素(值是 undefined)。在最后一次循环里,i+1 引用了数组里还未初始化的一个位置。 在 Java、C/C+或 C#等一些语言里,这样写可能会抛出异常,因此不得不在 numbers.length- 1 处停止循环。 可以看到,我们只是把数组第一位的值用第二位覆盖了,并没有删除元素(因为数组的长度 和之前还是一样的,并且多了一个未定义元素)。 要从数组中移除这个值,还可以创建一个包含刚才所讨论逻辑的方法,叫作 removeFirst￾Position。但是,要真正从数组中移除这个元素,我们需要创建一个新的数组,将所有不是 undefined 的值从原来的数组复制到新的数组中,并且将这个新的数组赋值给我们的数组。要 完成这项工作,也可以像下面这样创建一个 reIndex 方法。 Array.prototype.reIndex = function(myArray) { const newArray = []; for(let i = 0; i < myArray.length; i++ ) { if (myArray[i] !== undefined) { // console.log(myArray[i]); newArray.push(myArray[i]); } } return newArray; } // 手动移除第一个元素并重新排序 Array.prototype.removeFirstPosition = function() { for (let i = 0; i < this.length; i++) { this[i] = this[i + 1]; } return this.reIndex(this); }; numbers = numbers.removeFirstPosition(); 上面的代码只应该用作示范,不应该在真实项目中使用。要从数组开头删除元素, 我们应该始终使用 shift 方法,这将在下一节中展示。 使用 shift 方法 要删除数组的第一个元素,可以用 shift 方法实现。 numbers.shift(); 假如本来数组中的值是从4 到 12,长度为 17。执行了上述代码后,数组就只有3 到 12 了, 长度也会减小到 16。 通过 shift 和 unshift 方法,我们就能用数组模拟基本的队列数据结构,第 5 章会讲到。 3.6 二维和多维数组 51 1 2 3 4 5 5 6 7 8 9 0 1 2 3 4 3.5 在任意位置添加或删除元素 目前为止,我们已经学习了如何添加元素到数组的开头或末尾,以及怎样删除数组开头和结 尾位置上的元素。那么如何在数组中的任意位置上删除或添加元素呢? 我们可以使用 splice 方法,简单地通过指定位置/索引,就可以删除相应位置上指定数量 的元素。 numbers.splice(5,3); 这行代码删除了从数组索引 5 开始的 3 个元素。这就意味着 numbers[5]、numbers[6]和 numbers[7]从数组中删除了。现在数组里的值变成了3、2、1、0、1、5、6、7、8、9、10、 11 和 12(2、3、4 已经被移除)。 对于 JavaScript 数组和对象,我们还可以用 delete 运算符删除数组中的元素, 例如 delete numbers[0]。然而,数组位置 0 的值会变成 undefined,也就 是说,以上操作等同于 numbers[0] = undefined。因此,我们应该始终使用 splice、pop 或 shift(马上就会学到)方法来删除数组元素。 现在,我们想把数 2、3、4 插入数组里,放到之前删除元素的位置上,可以再次使用 splice 方法。 numbers.splice(5, 0, 2, 3, 4); splice 方法接收的第一个参数,表示想要删除或插入的元素的索引值。第二个参数是删除 元素的个数(这个例子里,我们的目的不是删除元素,所以传入 0)。第三个参数往后,就是要 添加到数组里的值(元素 2、3、4)。输出会发现值又变成了从3 到 12。 最后,执行以下这行代码。 numbers.splice(5, 3, 2, 3, 4); 输出的值是从3 到 12。原因在于,我们从索引 5 开始删除了 3 个元素,但也从索引 5 开始 添加了元素 2、3、4。

上次更新于: 3/23/2022, 10:11:04 AM