javascript array(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
数组的基础概念与基本操作
在 JavaScript 开发中,数组(Array)是一个至关重要的数据结构,它像一个有序的容器,可以存储多个值。想象一下,数组就像一个书架,每个书架的位置(索引)对应着一本特定的书籍(元素)。与书籍可以是任何类型(小说、工具书、漫画)类似,JavaScript 数组可以包含任意类型的值,包括数字、字符串、对象甚至其他数组。
数组的创建与访问
创建数组最简单的方式是使用字面量语法,例如:
const books = ["JavaScript权威指南", "你不知道的JavaScript", "算法图解"];
每个元素的位置由索引(index)标识,索引从 0 开始。要访问某个元素,只需通过方括号语法:
console.log(books[0]); // 输出 "JavaScript权威指南"
常见基础操作
添加元素
push()
:将元素添加到数组末尾,如同在书架最右侧放新书:
books.push("前端性能优化指南");
unshift()
:在数组开头添加元素,相当于在书架最左侧放新书:
books.unshift("CSS权威指南");
删除元素
pop()
:移除末尾元素,类似于取下书架最右侧的书:
const removedBook = books.pop(); // removedBook 是最后一本书
shift()
:移除开头元素,相当于取下书架最左侧的书:
const firstBook = books.shift(); // firstBook 是原第一本书
修改元素
直接通过索引赋值即可修改元素:
books[1] = "JavaScript高级程序设计"; // 将第二个元素替换为新书名
数组长度与遍历
length
属性可以获取数组长度:
console.log(books.length); // 输出当前元素数量
遍历数组常用 for
循环:
for (let i = 0; i < books.length; i++) {
console.log(`第 ${i+1} 本书是:${books[i]}`);
}
JavaScript Array的常用方法详解
核心方法速览表
(以下为部分常用方法的简要说明)
方法 | 作用描述 | 返回值类型 |
---|---|---|
forEach() | 遍历执行回调函数 | undefined |
map() | 创建新数组,每个元素经回调处理 | 新数组 |
filter() | 根据条件筛选元素 | 新数组 |
reduce() | 累计计算,将数组归约为单个值 | 任意类型 |
sort() | 排序数组元素 | 当前数组引用 |
includes() | 检查元素是否存在 | 布尔值 |
方法详解与案例
map()
方法:数据转换的瑞士军刀
这个方法可以将数组中的每个元素通过回调函数转换为新值,并生成新数组。例如将书籍名称首字母大写:
const capitalizedBooks = books.map((book) => {
return book.charAt(0).toUpperCase() + book.slice(1);
});
filter()
方法:智能筛选器
根据条件过滤元素。例如筛选出包含"JavaScript"的书籍:
const jsBooks = books.filter(book => book.includes("JavaScript"));
reduce()
方法:数据聚合的魔法
通过累积过程将数组转换为单一值。例如统计书籍总字符数:
const totalChars = books.reduce((total, current) => {
return total + current.length;
}, 0);
sort()
方法:排序的艺术
默认按字符串 Unicode 码点排序,但可通过比较函数自定义排序:
// 按书名长度从短到长排序
books.sort((a, b) => a.length - b.length);
方法进阶用法
链式调用:组合方法的强大
可以将多个方法串联使用,例如先过滤再转换:
const longJsBooks = books
.filter(book => book.length > 20)
.map(book => `长书名:${book}`);
空值与边界条件处理
使用 Array.from()
转换类数组对象:
const nodeElements = document.querySelectorAll("div");
const nodesArray = Array.from(nodeElements);
JavaScript Array的高级特性
扩展运算符与解构赋值
扩展运算符(...)
可以解构数组或对象,用于合并数组:
const newBooks = [...books, "新书名"];
// 或者合并两个数组
const allBooks = [...books, ...anotherBooksArray];
解构赋值
简洁地提取数组元素:
const [first, second] = books;
console.log(first); // 第一本书名
原型方法与非破坏性操作
所有数组方法可分为两类:
- 破坏性方法(改变原数组):如
push()
、pop()
、sort()
- 非破坏性方法(返回新数组):如
map()
、filter()
、slice()
迭代器方法详解
find()
与 findIndex()
查找符合条件的第一个元素及其索引:
const foundBook = books.find(book => book === "你不知道的JavaScript");
const index = books.findIndex(book => book.includes("算法"));
every()
与 some()
检查所有元素是否符合条件:
const allShort = books.every(book => book.length < 20);
const hasLong = books.some(book => book.length > 20);
常见问题与最佳实践
误区警示
- 避免修改原数组:在需要保留原数据时,优先使用非破坏性方法
- 谨慎使用
==
:可能导致意外类型转换,推荐使用===
- 注意
sort()
的默认行为:数字排序需提供比较函数
性能优化技巧
- 批量操作:合并多次操作减少循环次数
- 使用
Array.isArray()
:验证数据类型避免意外错误 - 缓存长度值:在循环中将
length
存储到变量以提高性能
// 低效写法
for (let i = 0; i < books.length; i++) { ... }
// 优化写法
for (let i = 0, len = books.length; i < len; i++) { ... }
ES6+ 新特性应用
flatMap()
方法
结合 map()
和 flat()
的快捷方式:
const nested = [[1], [2], [3]];
const flattened = nested.flatMap(arr => arr); // [1,2,3]
fill()
方法
批量填充数组元素:
const numbers = new Array(5).fill(0); // [0,0,0,0,0]
实战案例:构建购物车系统
核心需求
实现一个包含以下功能的购物车:
- 添加商品
- 计算总价
- 移除指定商品
- 清空购物车
实现代码
class ShoppingCart {
constructor() {
this.items = [];
}
addItem(item) {
this.items.push(item);
}
removeItem(itemId) {
this.items = this.items.filter(item => item.id !== itemId);
}
getTotal() {
return this.items.reduce((total, item) => total + item.price, 0);
}
clearCart() {
this.items.length = 0;
}
}
// 使用示例
const cart = new ShoppingCart();
cart.addItem({id:1, name:"笔记本", price: 25});
cart.addItem({id:2, name:"钢笔", price: 8});
console.log(cart.getTotal()); // 33
cart.removeItem(1);
console.log(cart.getTotal()); // 8
代码解析
- 使用
push()
添加商品 - 通过
filter()
实现条件筛选删除 reduce()
累加计算总价length=0
快速清空数组
结论与展望
JavaScript Array 作为开发者日常工作中最常用的数据结构之一,其功能远超简单的数据存储。通过掌握基础操作、核心方法、高级特性和最佳实践,开发者可以显著提升代码的可读性、性能和功能性。随着 ES 版本的不断更新,如 Array.at()
、Array.from()
等新方法的加入,数组操作的灵活性和表达力也在持续增强。
建议读者通过实际项目应用这些知识,例如尝试用 map()
和 reduce()
重构传统循环代码,体验函数式编程的优势。记住,理解数组的内存机制和方法特性,是写出高效、健壮 JavaScript 代码的重要基础。