JavaScript 数组
数组是有序的数据集合,是 JavaScript 中使用最频繁的数据结构。一个数组可以存储任意类型的数据。
创建和访问
javascript
// 字面量创建(推荐)
const fruits = ['苹果', '香蕉', '橘子'];
// 构造函数创建(少用)
const numbers = new Array(1, 2, 3);
// 访问元素(索引从 0 开始)
console.log(fruits[0]); // "苹果"
console.log(fruits[2]); // "橘子"
console.log(fruits.length); // 3
// 最后一个元素
console.log(fruits[fruits.length - 1]); // "橘子" 基础操作
添加和删除元素
javascript
const arr = ['B'];
// 末尾操作
arr.push('C'); // ["B", "C"] 末尾添加
const last = arr.pop(); // "C",arr 变为 ["B"]
// 开头操作
arr.unshift('A'); // ["A", "B"] 开头添加
const first = arr.shift(); // "A",arr 变为 ["B"]
// arr 现在:["B"] slice() — 截取(不修改原数组)
javascript
const arr = ['A', 'B', 'C', 'D', 'E'];
arr.slice(1, 3); // ["B", "C"](索引 1~2)
arr.slice(2); // ["C", "D", "E"](从索引 2 到末尾)
arr.slice(-2); // ["D", "E"](倒数 2 个)
arr.slice(); // 完整副本(常用于复制数组) splice() — 增删改(会修改原数组)
javascript
const arr = ['A', 'B', 'C', 'D'];
// 删除:从索引1开始,删2个
arr.splice(1, 2); // 返回 ["B", "C"],arr 变为 ["A", "D"]
// 插入:从索引1开始,删0个,插入元素
arr.splice(1, 0, 'X', 'Y'); // arr 变为 ["A", "X", "Y", "D"]
// 替换:从索引1开始,删2个,插入元素
arr.splice(1, 2, 'Z'); // arr 变为 ["A", "Z", "D"] 查找元素
javascript
const arr = ['苹果', '香蕉', '橘子', '香蕉'];
arr.indexOf('香蕉'); // 1(首次出现的索引)
arr.lastIndexOf('香蕉'); // 3(最后出现的索引)
arr.indexOf('葡萄'); // -1(不存在)
arr.includes('苹果'); // true
arr.includes('葡萄'); // false 遍历数组
forEach() — 逐一处理
javascript
const items = ['A', 'B', 'C'];
items.forEach((item, index) => {
console.log(`${index}: ${item}`);
});
// 输出:0: A 1: B 2: C forEach() 不能中途退出(break 无效)。如果需要提前终止循环,用 for...of 或普通 for 循环。
for...of — 遍历值
javascript
for (const item of items) {
console.log(item);
} 数组变换(核心方法)
这些方法是现代 JavaScript 的精华,都不修改原数组,而是返回新数组。
map() — 映射
将每个元素转换为新值,生成等长的新数组:
javascript
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(n => n * 2);
// [2, 4, 6, 8]
const labels = numbers.map(n => `第${n}项`);
// ["第1项", "第2项", "第3项", "第4项"] filter() — 过滤
保留满足条件的元素,生成可能较短的新数组:
javascript
const numbers = [1, 2, 3, 4, 5, 6];
const evens = numbers.filter(n => n % 2 === 0);
// [2, 4, 6]
const adults = users.filter(user => user.age >= 18); reduce() — 归约
将数组”压缩”为一个值:
javascript
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((total, current) => total + current, 0);
// total 是累积值,current 是当前元素,0 是初始值
// 计算过程:0 → 1 → 3 → 6 → 10 find() / findIndex()
javascript
const users = [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' },
];
users.find(user => user.id === 2); // { id: 2, name: '李四' }
users.findIndex(user => user.id === 2); // 1
users.find(user => user.id === 99); // undefined(没找到) sort() — 排序
sort() 会修改原数组,且默认按字符串排序:
javascript
// 数字排序(升序)
const nums = [3, 1, 10, 2];
nums.sort((a, b) => a - b); // [1, 2, 3, 10]
// 数字排序(降序)
nums.sort((a, b) => b - a); // [10, 3, 2, 1]
// 字符串排序
const names = ['王五', '张三', '李四'];
names.sort(); // ["张三", "李四", "王五"](按拼音/Unicode) 其他常用方法
javascript
const arr1 = [1, 2];
const arr2 = [3, 4];
// 合并
arr1.concat(arr2); // [1, 2, 3, 4]
[...arr1, ...arr2]; // [1, 2, 3, 4](展开运算符,推荐)
// 转为字符串
[1, 2, 3].join(', '); // "1, 2, 3"
// 反转
[1, 2, 3].reverse(); // [3, 2, 1](会修改原数组)
// 检查是否为数组
Array.isArray([1, 2, 3]); // true
Array.isArray('hello'); // false