JavaScript 数组

数组是有序的数据集合,是 JavaScript 中使用最频繁的数据结构。一个数组可以存储任意类型的数据。

创建和访问

javascript
// 字面量创建(推荐)
const fruits = ['苹果', '香蕉', '橘子'];

// 构造函数创建(少用)
const numbers = new Array(1, 2, 3);

// 访问元素(索引从 0 开始)
document.write(fruits[0] + '<br>');     // "苹果"
document.write(fruits[2] + '<br>');     // "橘子"
document.write(fruits.length + '<br>'); // 3

// 最后一个元素
document.write(fruits[fruits.length - 1] + '<br>'); // "橘子"

基础操作

添加和删除元素

javascript
const arr = ['B'];
document.write('初始: ' + arr + '<br>');

// 末尾操作
arr.push('C');
document.write('push C 后: ' + arr + '<br>');
const last = arr.pop();
document.write('pop 后: ' + arr + '<br>');

// 开头操作
arr.unshift('A');
document.write('unshift A 后: ' + arr + '<br>');
const first = arr.shift();
document.write('shift 后: ' + arr + '<br>');

// arr 现在:["B"]
document.write('最终: ' + arr + '<br>');

slice() — 截取(不修改原数组)

javascript
const arr = ['A', 'B', 'C', 'D', 'E'];

document.write(arr.slice(1, 3) + '<br>');   // ["B", "C"](索引 1~2)
document.write(arr.slice(2) + '<br>');      // ["C", "D", "E"](从索引 2 到末尾)
document.write(arr.slice(-2) + '<br>');     // ["D", "E"](倒数 2 个)
document.write(arr.slice() + '<br>');       // 完整副本(常用于复制数组)

splice() — 增删改(会修改原数组)

javascript
const arr = ['A', 'B', 'C', 'D'];
document.write('初始: ' + arr + '<br>');

// 删除:从索引1开始,删2个
const removed = arr.splice(1, 2);
document.write('删除后: ' + arr + ',删除: ' + removed + '<br>');

// 插入:从索引1开始,删0个,插入元素
arr.splice(1, 0, 'X', 'Y');
document.write('插入后: ' + arr + '<br>');

// 替换:从索引1开始,删2个,插入元素
arr.splice(1, 2, 'Z');
document.write('替换后: ' + arr + '<br>');

查找元素

javascript
const arr = ['苹果', '香蕉', '橘子', '香蕉'];

document.write(arr.indexOf('香蕉') + '<br>');      // 1(首次出现的索引)
document.write(arr.lastIndexOf('香蕉') + '<br>');  // 3(最后出现的索引)
document.write(arr.indexOf('葡萄') + '<br>');      // -1(不存在)

document.write(arr.includes('苹果') + '<br>');     // true
document.write(arr.includes('葡萄') + '<br>');     // false

遍历数组

forEach() — 逐一处理

javascript
const items = ['A', 'B', 'C'];

items.forEach((item, index) => {
  document.write(`${index}: ${item}<br>`);
});

forEach() 不能中途退出(break 无效)。如果需要提前终止循环,用 for...of 或普通 for 循环。

for...of — 遍历值

javascript
for (const item of items) {
  document.write(item + '<br>');
}

数组变换(核心方法)

这些方法是现代 JavaScript 的精华,都不修改原数组,而是返回新数组

map() — 映射

将每个元素转换为新值,生成等长的新数组:

javascript
const numbers = [1, 2, 3, 4];

const doubled = numbers.map(n => n * 2);
document.write('doubled: ' + doubled + '<br>');
// [2, 4, 6, 8]

const labels = numbers.map(n => `第${n}项`);
document.write('labels: ' + labels + '<br>');
// ["第1项", "第2项", "第3项", "第4项"]

filter() — 过滤

保留满足条件的元素,生成可能较短的新数组:

javascript
const numbers = [1, 2, 3, 4, 5, 6];

const evens = numbers.filter(n => n % 2 === 0);
document.write('evens: ' + evens + '<br>');
// [2, 4, 6]

const adults = users.filter(user => user.age >= 18);
document.write('adults: ' + JSON.stringify(adults) + '<br>');

reduce() — 归约

将数组”压缩”为一个值:

javascript
const numbers = [1, 2, 3, 4];

const sum = numbers.reduce((total, current) => total + current, 0);
document.write('sum: ' + sum + '<br>');
// total 是累积值,current 是当前元素,0 是初始值
// 计算过程:0 → 1 → 3 → 6 → 10

find() / findIndex()

javascript
const users = [
  { id: 1, name: '张三' },
  { id: 2, name: '李四' },
  { id: 3, name: '王五' },
];

document.write(JSON.stringify(users.find(user => user.id === 2)) + '<br>');       // { id: 2, name: '李四' }
document.write(users.findIndex(user => user.id === 2) + '<br>');  // 1
document.write(JSON.stringify(users.find(user => user.id === 99)) + '<br>');      // undefined(没找到)

sort() — 排序

sort() 会修改原数组,且默认按字符串排序:

javascript
// 数字排序(升序)
const nums = [3, 1, 10, 2];
nums.sort((a, b) => a - b);
document.write('升序: ' + nums + '<br>');
// [1, 2, 3, 10]

// 数字排序(降序)
nums.sort((a, b) => b - a);
document.write('降序: ' + nums + '<br>');
// [10, 3, 2, 1]

// 字符串排序
const names = ['王五', '张三', '李四'];
names.sort();
document.write('字符串排序: ' + names + '<br>');
// ["张三", "李四", "王五"](按拼音/Unicode)

其他常用方法

javascript
const arr1 = [1, 2];
const arr2 = [3, 4];

// 合并
document.write('concat: ' + arr1.concat(arr2) + '<br>');          // [1, 2, 3, 4]
document.write('spread: ' + [...arr1, ...arr2] + '<br>');         // [1, 2, 3, 4](展开运算符,推荐)

// 转为字符串
document.write('join: ' + [1, 2, 3].join(', ') + '<br>');         // "1, 2, 3"

// 反转
document.write('reverse: ' + [1, 2, 3].reverse() + '<br>');      // [3, 2, 1](会修改原数组)

// 检查是否为数组
document.write('Array.isArray([1,2,3]): ' + Array.isArray([1, 2, 3]) + '<br>');   // true
document.write('Array.isArray("hello"): ' + Array.isArray('hello') + '<br>');     // false