在 JavaScript 中,数组是一种类似列表的结构,长度不固定,可以存放任意类型的原始值或对象,甚至可以混合存放。
它带有 length 属性,还有许多实用的方法,用于遍历和修改数组。
要创建数组,把元素写在方括号 [] 之间。
要从数组中读取元素,把下标写在标识符后面的方括号 [] 里。数组的下标从零开始。
例如:
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names[1];
// => Laura
也可以用构造函数语法创建数组,但大多数情况下推荐使用数组字面量语法。
const names = new Array();
names.push('Jack', 'Laura', 'Paul', 'Megan');
names[1];
// => Laura
数组不能用strings作为元素下标,必须使用整数(number)。
使用方括号表示法(或点表示法)通过非整数来设置或访问时,并不会设置或读取数组列表本身的元素,而是设置或访问与该数组的对象属性集合相关联的变量。
数组的对象属性和数组元素列表是彼此独立的,数组的遍历和修改操作无法作用于这些具名属性。
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.length;
// => 4
// Properties can be set on arrays using bracket ['property'] or
// dot .property notation, and this will affect the length, as
// shown below.
names.magician = 'Elyse';
names.length;
// => 4
// The property shows up when logging the array, making it seem
// that the property is somehow incorporated in the array.
names;
// => ["Jack", "Laura", "Paul", "Megan", magician: "Elyse"]
// However, be aware. Properties added via non-numeric keys are
// NOT part of the array's internal list, and are not traversed
// or mutated when using one of the traversal or mutation
// operations.
names.forEach((name) => console.log(name));
// => Jack
// => Laura
// => Paul
// => Megan
JavaScript 中的数组也是普通的 objects,可以用 delete 关键字删除其中的元素。
然而,这不会改变数组的 长度,而是留下一个 empty 空洞。
在其他语言中,这类似于稀疏数组。
使用遍历或修改操作时,empty 空洞会被跳过。
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
delete names[1];
names;
// => ["Jack", empty, "Paul", "Megan"]
names.length;
// => 4
names.forEach((name) => console.log(name));
// => Jack
// => Paul
// => Megan
如果不希望出现空洞,并且希望 length 反映将被遍历或修改的元素数量,请改用 splice。
splice() 方法通过就地移除或替换现有元素和/或添加新元素来改变数组的内容。1
例如:
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.splice(1, 1);
names;
// => ["Jack", "Paul", "Megan"]
names.length;
// => 3
names.forEach((name) => console.log(name));
// => Jack
// => Paul
// => Megan
数组的 length 属性与数组所持有的元素列表相关联。
它可以被修改。
增加长度时,会创建 empty 空洞,遍历或修改数组时不会考虑这些空洞。
减小长度时,会_移除_数组末尾的元素。
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.length = 6;
names;
// => ["Jack", "Laura", "Paul", "Megan", empty × 2]
names.length = 2;
// => ["Jack", "Laura"]
因为数组是 objects,所以 typeof names 的结果是 "object"。
要检查某个值是否为数组,请使用 Array.isArray:
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
typeof names;
// => "object"
Array.isArray(names);
// => true
const object = {};
Array.isArray(object);
// => false
你可能会想用 names instanceof Array,这有时可行,但并非在所有情况下都适用。
更多信息请阅读这篇文章。
每个数组对象都有一些可用的方法,可以用来向数组添加元素或从中删除元素。 下面是其中几个:
push()方法向数组末尾添加一个或多个元素,并返回数组的新长度。2
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.push('Jill'); // => 5
names;
// => ['Jack', 'Laura', 'Paul', 'Megan', 'Jill']
pop()方法移除数组的最后一个元素,并返回该元素。 此方法会改变数组的长度。3
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.pop(); // => 'Megan'
names;
// => ['Jack', 'Laura', 'Paul']
shift()方法移除数组的第一个元素,并返回被移除的元素。 此方法会改变数组的长度。4
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.shift(); // => 'Jack'
names;
// => ['Laura', 'Paul', 'Megan']
unshift() 方法向数组开头添加一个或多个元素,并返回数组的新长度。5
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.unshift('Jill'); // => 5
names;
// => ['Jill', 'Jack', 'Laura', 'Paul', 'Megan']
splice() 方法通过就地移除或替换现有元素和/或添加新元素来改变数组的内容。 此方法返回一个包含被删除元素的数组。1
const names = ['Jack', 'Laura', 'Paul', 'Megan'];
names.splice(2, 1, 'Jill'); // => ['Paul']
names;
// => ['Jack', 'Laura', 'Jill', 'Megan']
splice,MDN。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice(参考日期:2021 年 9 月 29 日) ↩
push,MDN。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push(参考日期:2021 年 9 月 29 日) ↩
pop,MDN。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop(参考日期:2021 年 9 月 29 日) ↩
shift,MDN。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift(参考日期:2021 年 9 月 29 日) ↩
unshift,MDN。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift(参考日期:2021 年 9 月 29 日) ↩