1. 概述

数组是一种特殊类型的对象。在 JavaScript 中对数组使用 typeof 运算符会返回 “object”。

  • 数组元素可以通过下表访问(非键值对数组),也可以通过键访问(键值对数组)。
  • JavaScript 变量可以是对象。数组是特殊类型的对象。可以在相同数组中存放不同类型的变量:对象、函数、数组等……

1.1 创建数组

  • 语法:
1
2
var array-name = [item1, item2, ...];
var cars = new Array("Saab", "Volvo", "BMW");

1.2 访问数组元素

  • 通过引用索引号(下标号)来引用某个数组元素。

1.3 添加数组元素

  • 向数组添加新元素的最佳方法是使用 push() 方法。
  • 也可以使用下标直接向数组添加新元素(若添加索引高出数组当前长度范围,则会在数组中未赋值的下标位置创建未定义的“洞”):
1
2
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[fruits.length] = "Lemon"; // 向 fruits 添加一个新元素 (Lemon)

1.4 数组和对象的区别

  • 在 JavaScript 中,数组使用数字索引。
  • 在 JavaScript 中,对象使用命名索引。

2. 属性

  • length :属性返回数组的长度(数组元素的数目)。

3. 方法

  • toString() :把数组转换为数组值(逗号分隔)的字符串。
    【注】所有 JavaScript 对象都拥有 toString() 方法。
  • join() :方法也可将所有数组元素结合为一个字符串。它的行为类似 toString(),但是您还可以规定分隔符。
  • pop() :方法从数组中删除最后一个元素。pop() 方法返回“被弹出”的值。
  • push() :方法(在数组结尾处)向数组添加一个新的元素。push() 方法返回新数组的长度。
  • shift() :方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。shift() 方法返回被“位移出”的字符串。
  • unshift() :方法(在开头)向数组添加新元素,并“反向位移”旧元素。unshift() 方法返回新数组的长度。
  • splice() :方法可用于向数组添加新项。splice() 方法返回一个包含已删除项的数组。
1
2
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");

其中,第一个参数(2)定义了应添加新元素的位置(拼接);第二个参数(0)定义应删除多少元素;其余参数(“Lemon”,“Kiwi”)定义要添加的新元素。
【注】其余参数可省略。

  • concat() :方法通过合并(连接)现有数组来创建一个新数组。concat() 方法不会更改现有数组。它总是返回一个新数组。concat() 方法可以使用任意数量的数组参数。
  • slice() :方法用数组的某个片段切出新数组。slice() 方法创建新数组。它不会从源数组中删除任何元素。

slice() 可接受两个参数,比如 (1, 3)。该方法会从开始参数选取元素,直到结束参数(不包括)为止。如果结束参数被省略,比如第一个例子,则 slice() 会切出数组的剩余部分。

  • sort() :方法以字母顺序对数组进行排序。sort() 可以接受自定义的比较函数来定义自己的排序顺序。
1
2
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
  • reverse() :方法反转数组中的元素。
  • Math.max.apply() :来查找数组中的最大值。
  • Math.min.apply() :来查找数组中的最低值。
1
2
3
4
5
6
function myArrayMax(arr) {
return Math.max.apply(null, arr);
}
function myArrayMin(arr) {
return Math.min.apply(null, arr);
}

【注】以下方法老版本浏览器(比如 Internet Explorer 8 或更早的版本)不支持。

  • forEach() :方法为每个数组元素调用一次函数(回调函数)。
1
2
3
4
5
6
var txt = "";
var numbers = [45, 4, 9, 16, 25];
numbers.forEach(myFunction);
function myFunction(value, index, array) {
txt = txt + value + "<br>";
}

该函数接受 3 个参数:

  1. 项目值
  2. 项目索引
  3. 数组本身
  • map() :方法通过对每个数组元素执行函数来创建新数组。
  1. map() 方法不会对没有值的数组元素执行函数。
  2. map() 方法不会更改原始数组。
1
2
3
4
5
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);
function myFunction(value, index, array) {
return value * 2;
}

该函数接受 3 个参数(当回调函数仅使用 value 参数时,可以省略索引和数组参数):

  1. 项目值
  2. 项目索引
  3. 数组本身
  • filter() :方法创建一个包含通过测试的数组元素的新数组。
1
2
3
4
5
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);
function myFunction(value, index, array) {
return value > 18;
}

该函数接受 3 个参数(当回调函数仅使用 value 参数时,可以省略索引和数组参数):

  1. 项目值
  2. 项目索引
  3. 数组本身
  • reduce() :方法在每个数组元素上运行函数,以生成(减少它)单个值。
  1. reduce() 方法在数组中从左到右工作。另请参见 reduceRight()。
  2. reduce() 方法不会减少原始数组。
  3. reduce() 方法能够接受一个初始值。
1
2
3
4
5
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction, 100);
function myFunction(total, value) {
return total + value;
}

此函数接受 4 个参数:

  1. 总数(初始值/先前返回的值)
  2. 项目值
  3. 项目索引
  4. 数组本身
  • reduceRight() :(同 reduce() 方法)方法在每个数组元素上运行函数,以生成(减少它)单个值。
  1. reduceRight() 方法在数组中从左到右工作。另请参见 reduce()。
  2. reduceRight() 方法不会减少原始数组。
  3. reduceRight() 方法能够接受一个初始值。
1
2
3
4
5
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduceRight(myFunction);
function myFunction(total, value, index, array) {
return total + value;
}

此函数接受 4 个参数:

  1. 总数(初始值/先前返回的值)
  2. 项目值
  3. 项目索引
  4. 数组本身
  • every() :方法检查所有数组值是否通过测试。
1
2
3
4
5
var numbers = [45, 4, 9, 16, 25];
var allOver18 = numbers.every(myFunction);
function myFunction(value) {
return value > 18;
}

此函数接受 3 个参数:

  1. 项目值
  2. 项目索引
  3. 数组本身
  • some() :方法检查某些数组值是否通过了测试。
1
2
3
4
5
var numbers = [45, 4, 9, 16, 25];
var someOver18 = numbers.some(myFunction);
function myFunction(value, index, array) {
return value > 18;
}

此函数接受 3 个参数:

  1. 项目值
  2. 项目索引
  3. 数组本身
  • indexOf() :方法在数组中搜索元素值并返回其位置。

语法格式:

1
array.indexOf(item, start)
item 必需。要检索的项目。
start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到结尾。
  • lastIndexOf() :与 indexOf() 类似,但是从数组结尾开始搜索。
    语法格式:
1
array.lastIndexOf(item, start)
item 必需。要检索的项目。
start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到开头。
  • find() :方法返回通过测试函数的第一个数组元素的值。
1
2
3
4
5
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction);
function myFunction(value, index, array) {
return value > 18;
}

此函数接受 3 个参数:

  1. 项目值
  2. 项目索引
  3. 数组本身
  • findIndex() :方法返回通过测试函数的第一个数组元素的索引。
1
2
3
4
5
var numbers = [4, 9, 16, 25, 29];
var first = numbers.findIndex(myFunction);
function myFunction(value, index, array) {
return value > 18;
}

此函数接受 3 个参数:

  1. 项目值
  2. 项目索引
  3. 数组本身

4. 其他

  • delete 运算符可用于删除数组项。
    【注】使用 delete 会在数组留下未定义的空洞。