JavaScript栈与队列:从数据结构到事件循环的实战指南
1. 从生活场景到代码世界为什么栈和队列如此重要如果你在食堂打过饭或者在银行取过号那你已经直观地理解了队列。如果你叠过一摞盘子或者经历过“套娃”式的函数调用那你已经体验了栈的精髓。在JavaScript的世界里栈Stack和队列Queue这两种基础数据结构远不止是教科书上的抽象概念它们是构建复杂程序逻辑、理解代码执行流程的基石。很多开发者觉得数据结构是面试时才需要突击的“八股文”但当你真正理解它们你会发现日常开发中遇到的很多“坑”和性能瓶颈其根源往往就藏在这些基础结构的误用或误解里。比如你写递归函数时如果递归层数过深浏览器可能会报错“Maximum call stack size exceeded”超出最大调用栈大小。这个“栈”是什么为什么它会溢出又比如在处理用户的一系列点击事件或者管理一个异步任务列表时如何保证它们按预期的顺序执行这时候“队列”的思维就能派上用场。理解栈和队列不仅能帮你写出更健壮、更高效的代码更能让你深入理解JavaScript引擎如V8是如何工作的从“会用”走向“懂原理”。本文将从零开始抛开晦涩的术语用最贴近开发的视角带你重新认识栈和队列。我们会从它们在内存中的模样讲到如何用JavaScript亲手实现从“函数调用栈”这个最经典的案例延伸到“事件循环”中的任务队列。你会发现这些看似简单的结构正是连接JavaScript基础语法与高级应用如算法、框架设计的关键桥梁。2. 栈后进先出的“叠盘子”模型栈是一种遵循后进先出原则的线性数据结构。你可以把它想象成一摞盘子你总是把新盘子放在最上面入栈也总是从最上面拿走盘子出栈。你没法直接抽走中间或底部的盘子。在计算机科学中这种特性使其非常适合管理具有嵌套或回溯性质的操作。2.1 栈的核心操作与JavaScript实现栈通常支持以下几种基本操作push(element): 添加一个新元素到栈顶。pop(): 移除并返回栈顶的元素。peek()或top(): 返回栈顶元素但不移除它。isEmpty(): 判断栈是否为空。size(): 返回栈中元素的个数。clear(): 清空栈。在JavaScript中我们可以非常方便地利用数组Array来模拟栈的所有行为因为数组原生就提供了push和pop方法它们正好符合栈的后进先出特性。// 基于数组的栈实现 class Stack { constructor() { this.items []; } // 入栈 push(element) { this.items.push(element); } // 出栈 pop() { if (this.isEmpty()) { return 栈已空; } return this.items.pop(); } // 查看栈顶 peek() { if (this.isEmpty()) { return 栈为空; } return this.items[this.items.length - 1]; } // 判断是否为空 isEmpty() { return this.items.length 0; } // 返回大小 size() { return this.items.length; } // 清空栈 clear() { this.items []; } // 打印栈内容辅助方法 print() { console.log(this.items.toString()); } } // 使用示例 const stack new Stack(); console.log(stack.isEmpty()); // true stack.push(5); stack.push(8); console.log(stack.peek()); // 8 stack.push(11); console.log(stack.size()); // 3 console.log(stack.isEmpty()); // false stack.pop(); stack.pop(); console.log(stack.size()); // 1 stack.print(); // 5注意虽然我们用数组实现了栈但严格来说我们只应该使用push和pop来操作这个数组的末端以维持栈的特性。如果使用了shift、unshift或直接通过索引修改中间元素就破坏了栈的约束。在实际项目中如果你需要一个严格的栈最好封装成类并只暴露标准栈方法避免内部数组被误操作。2.2 栈的经典应用场景函数调用与括号匹配1. 函数调用栈Call Stack这是栈最核心、最底层的应用。当JavaScript引擎执行一个函数时它会创建一个“栈帧”并将其推入调用栈。这个栈帧包含了函数的参数、局部变量和返回地址等信息。如果这个函数内部又调用了其他函数那么新的栈帧会被推入栈顶。当函数执行完毕返回时它的栈帧会被弹出程序回到上一个栈帧即调用者中继续执行。function funcA() { console.log(进入A); funcB(); // 调用funcBfuncB的栈帧被推入栈顶 console.log(离开A); } function funcB() { console.log(进入B); funcC(); // 调用funcCfuncC的栈帧被推入栈顶 console.log(离开B); } function funcC() { console.log(进入C); console.log(离开C); // funcC执行完毕栈帧弹出 } funcA(); // 调用funcAfuncA的栈帧被推入栈顶 // 执行顺序进入A - 进入B - 进入C - 离开C - 离开B - 离开A这个过程完美诠释了“后进先出”最后被调用的funcC最先执行完毕并返回。递归函数就是不断自我调用向调用栈中推入栈帧如果递归没有终止条件或层数过深就会导致“栈溢出”错误。2. 括号匹配问题这是一个经典的算法面试题也是栈的典型应用。给定一个只包含(){}[]的字符串判断括号是否有效闭合。思路遍历字符串遇到左括号就将其压入栈中遇到右括号时检查栈顶的左括号是否与之匹配。如果匹配则弹出栈顶如果不匹配或栈已空则字符串无效。最后如果栈为空说明所有括号都正确闭合。为什么用栈因为括号的闭合需要最近的左括号和右括号匹配这正好是“后进先出”的关系。最后出现的左括号需要最先被匹配闭合。function isValidParentheses(s) { const stack []; const map { ): (, ]: [, }: { }; for (let char of s) { if (!map[char]) { // 是左括号入栈 stack.push(char); } else { // 是右括号检查栈顶是否匹配 if (stack.pop() ! map[char]) { return false; } } } // 最终栈应为空 return stack.length 0; } console.log(isValidParentheses(()[]{})); // true console.log(isValidParentheses(([)])); // false console.log(isValidParentheses({[]})); // true3. 队列先进先出的“排队”模型队列是一种遵循先进先出原则的线性数据结构。就像现实生活中的排队先来的人先接受服务后来的人排在队尾。在计算机中队列广泛用于需要按序处理任务的场景如打印任务、消息传递、广度优先搜索等。3.1 队列的核心操作与JavaScript实现队列的基本操作包括enqueue(element): 向队列尾部添加一个元素。dequeue(): 移除并返回队列头部的元素。front(): 返回队列头部的元素但不移除。isEmpty(): 判断队列是否为空。size(): 返回队列中元素的个数。clear(): 清空队列。同样我们可以用数组模拟队列。但这里有一个性能陷阱如果单纯用数组dequeue方法移除头部元素如果使用shift()在数组很大时因为需要移动所有后续元素的索引时间复杂度是O(n)性能较差。// 基础但低效的队列实现使用数组shift class Queue { constructor() { this.items []; } enqueue(element) { this.items.push(element); // O(1) } dequeue() { if (this.isEmpty()) { return 队列已空; } return this.items.shift(); // O(n) !!! } front() { if (this.isEmpty()) { return 队列为空; } return this.items[0]; } isEmpty() { return this.items.length 0; } size() { return this.items.length; } clear() { this.items []; } print() { console.log(this.items.toString()); } }为了优化性能我们可以实现一个基于对象的队列它通过维护head和tail两个指针来避免数组元素的移动使enqueue和dequeue操作都达到O(1)的时间复杂度。// 高效队列实现基于对象 class EfficientQueue { constructor() { this.items {}; // 用对象存储元素 this.head 0; // 指向队列头部的索引 this.tail 0; // 指向队列尾部的索引下一个元素要插入的位置 } enqueue(element) { this.items[this.tail] element; this.tail; } dequeue() { if (this.isEmpty()) { return 队列已空; } const item this.items[this.head]; delete this.items[this.head]; this.head; // 可选定期重置指针以回收内存当队列大部分时间为空时 if (this.isEmpty()) { this.head 0; this.tail 0; } return item; } front() { if (this.isEmpty()) { return 队列为空; } return this.items[this.head]; } isEmpty() { return this.tail - this.head 0; } size() { return this.tail - this.head; } clear() { this.items {}; this.head 0; this.tail 0; } print() { const result []; for (let i this.head; i this.tail; i) { result.push(this.items[i]); } console.log(result.toString()); } }3.2 队列的变体双端队列与优先队列1. 双端队列双端队列允许从头部和尾部两端进行添加和删除操作。它结合了栈和队列的特性非常灵活。JavaScript数组本身就可以看作是一个双端队列因为它提供了push/pop尾和unshift/shift头方法。但在需要严格队列语义或高性能场景下最好还是封装一个专门的类。2. 优先队列在优先队列中元素被赋予优先级。出队时优先级最高的元素先出队而非简单的先进先出。这通常通过“堆”这种数据结构来实现但我们可以用数组简单模拟每次入队排序或出队时查找最高优先级元素。这在任务调度、Dijkstra算法等场景中非常有用。// 一个简单的优先队列实现出队时查找优先级最高者性能非最优 class PriorityQueue { constructor() { this.items []; } enqueue(element, priority) { const queueElement { element, priority }; this.items.push(queueElement); } dequeue() { if (this.isEmpty()) return null; // 找出优先级最高的项数字越小优先级越高 let highestPriorityIndex 0; for (let i 1; i this.items.length; i) { if (this.items[i].priority this.items[highestPriorityIndex].priority) { highestPriorityIndex i; } } // 移除并返回该项 return this.items.splice(highestPriorityIndex, 1)[0].element; } // ... 其他方法省略 }3.3 队列在JavaScript中的核心应用事件循环与任务队列这是理解现代JavaScript异步编程的钥匙。JavaScript是单线程的但它通过“事件循环”机制来处理异步操作如setTimeout、fetch、DOM事件。调用栈同步代码执行的地方一个函数执行完才会执行下一个。任务队列一个先进先出的队列用于存放待执行的回调函数。当异步操作完成时如定时器到期、请求返回其回调函数会被放入对应的任务队列中。事件循环它不断检查调用栈是否为空。一旦调用栈为空事件循环就会从任务队列中取出第一个任务回调函数并将其推入调用栈开始执行。这个过程确保了异步回调总在同步代码执行完后才运行并且多个异步回调是按它们被加入队列的顺序依次执行的对于同一个队列而言。这里还有“微任务队列”的概念它比“宏任务队列”拥有更高的优先级但核心的“队列”思想不变。console.log(1. 同步任务开始); setTimeout(() { console.log(4. 宏任务来自setTimeout); }, 0); Promise.resolve().then(() { console.log(3. 微任务来自Promise); }); console.log(2. 同步任务结束); // 输出顺序1 - 2 - 3 - 4 // 解释同步代码先入栈执行完。然后事件循环先清空微任务队列Promise.then再执行宏任务队列setTimeout。理解了这个模型你就能明白为什么Promise.then的回调会比setTimeout的回调先执行也能更好地处理复杂的异步流程。4. 栈与队列的实战对比与算法初探理解了基本概念后我们通过几个具体的算法问题来感受栈和队列在解决问题时思维方式的差异。4.1 用栈实现队列用队列实现栈这是一个经典的面试题能很好地检验你对这两种数据结构特性的理解。题目一用栈实现队列要求实现一个MyQueue类使用栈后进先出来模拟队列先进先出的操作。思路需要两个栈一个作为输入栈stackIn一个作为输出栈stackOut。入队直接压入stackIn。出队/查看队首如果stackOut为空则将stackIn中的所有元素依次弹出并压入stackOut。这样stackOut的栈顶元素就是最早进入stackIn的元素即队列头部。然后对stackOut进行pop或peek操作。本质通过两个栈的“倒腾”将顺序从“后进先出”反转了两次变成了“先进先出”。class MyQueue { constructor() { this.stackIn []; this.stackOut []; } push(x) { this.stackIn.push(x); } pop() { if (this.stackOut.length 0) { while (this.stackIn.length 0) { this.stackOut.push(this.stackIn.pop()); } } return this.stackOut.pop(); } peek() { const res this.pop(); // 复用pop逻辑但需要把元素放回去 this.stackOut.push(res); return res; } empty() { return this.stackIn.length 0 this.stackOut.length 0; } }题目二用队列实现栈要求实现一个MyStack类使用队列先进先出来模拟栈后进先出的操作。思路单队列法只用一个队列。每次入栈新元素后都将队列中之前的元素依次出队再入队使得新元素被移动到队列头部。这样队列的头部始终是最后入栈的元素。本质通过队列内部的循环将新元素“推”到最前面模拟了栈顶。class MyStack { constructor() { this.queue []; } push(x) { this.queue.push(x); // 将新元素之前的元素全部移到它后面 let size this.queue.length; while (size 1) { this.queue.push(this.queue.shift()); size--; } } pop() { return this.queue.shift(); } top() { return this.queue[0]; } empty() { return this.queue.length 0; } }4.2 算法中的应用广度优先与深度优先栈和队列是许多经典算法的核心数据结构。深度优先搜索通常使用栈递归本质也是利用系统调用栈来实现。它沿着一条路径深入探索到底再回溯。适合解决“是否存在路径”、“所有可能解”类问题。广度优先搜索通常使用队列来实现。它从起点开始一层一层地向外探索。适合解决“最短路径”、“最少步骤”类问题。例如在二叉树遍历中DFS深度优先前序、中序、后序遍历递归写法隐式使用了栈迭代写法显式使用栈。BFS广度优先层序遍历必须使用队列。// 二叉树的层序遍历BFS使用队列 function levelOrder(root) { const result []; if (!root) return result; const queue [root]; // 队列初始化放入根节点 while (queue.length 0) { const levelSize queue.length; // 当前层的节点数 const currentLevel []; for (let i 0; i levelSize; i) { const currentNode queue.shift(); // 出队 currentLevel.push(currentNode.val); // 将下一层的节点入队 if (currentNode.left) queue.push(currentNode.left); if (currentNode.right) queue.push(currentNode.right); } result.push(currentLevel); } return result; }5. 性能考量、常见陷阱与选型建议在实际开发中选择栈还是队列以及如何实现它们需要结合具体场景和性能要求。5.1 时间复杂度与空间复杂度分析栈基于数组push、pop、peek、size、isEmpty操作的时间复杂度都是O(1)。空间复杂度为O(n)n为元素数量。队列基于对象的高效实现enqueue、dequeue、front、size、isEmpty操作的时间复杂度也都是O(1)。空间复杂度为O(n)。队列基于数组使用shiftdequeue操作的时间复杂度是O(n)这是需要避免的。5.2 开发中的常见“坑”栈溢出最常见于未正确终止的递归函数或递归深度过深。解决方案包括将递归改为迭代手动维护栈或者使用尾递归优化但JavaScript引擎支持有限。队列阻塞与内存泄漏在生产者-消费者模型中如果生产速度远大于消费速度队列会无限增长导致内存耗尽。需要设计合理的队列容量限制和拒绝策略。并发访问问题在Node.js或Web Worker等多线程/异步环境下如果多个操作同时修改同一个栈或队列可能导致状态不一致。需要使用锁或其他同步机制在JavaScript中可能涉及Promise、async/await的串行化控制。错误处理在pop或dequeue时如果栈/队列为空应有明确的处理逻辑返回特定值或抛出错误避免undefined引发后续问题。5.3 如何根据场景选择栈或队列选择的核心在于处理顺序的需求。使用栈的场景函数调用/递归语言运行时自动管理。撤销操作编辑器中的“撤销”每次操作压栈撤销时出栈。括号/标签匹配HTML标签闭合、代码语法检查。路径回溯迷宫求解、文件系统路径导航如“../”。表达式求值将中缀表达式转换为后缀表达式逆波兰表达式并求值。使用队列的场景任务调度打印机任务队列、JavaScript事件循环中的任务队列。消息传递聊天应用的消息顺序保证、系统间的解耦如RabbitMQ、Kafka等消息队列中间件。广度优先搜索寻找社交网络中的最短关系链、网页爬虫按层抓取。缓存淘汰策略实现LRU缓存时可以用队列维护键的使用顺序。异步请求限流控制同时发起的请求数量将超额请求放入队列等待。最后我想分享一点个人体会学习数据结构切忌死记硬背实现代码。最重要的是理解其抽象模型和操作特性。当你遇到一个具体问题时先问自己我需要一种什么样的数据存取顺序是像叠盘子一样后进先出还是像排队一样先进先出一旦确定了模型实现只是选择合适工具数组、对象、链表的问题。把栈和队列吃透它们会成为你代码工具箱里最趁手、最可靠的两把利器无论是解决LeetCode上的算法题还是设计一个复杂的系统流程都能让你思路清晰游刃有余。

相关新闻

3步解决魔兽争霸3现代兼容难题:WarcraftHelper完全优化指南

3步解决魔兽争霸3现代兼容难题:WarcraftHelper完全优化指南

3步解决魔兽争霸3现代兼容难题:WarcraftHelper完全优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争霸3》在…

2026/8/12 13:12:18 阅读更多 →
BetterNCM插件管理器:3分钟解决网易云音乐插件安装难题的完整指南

BetterNCM插件管理器:3分钟解决网易云音乐插件安装难题的完整指南

BetterNCM插件管理器:3分钟解决网易云音乐插件安装难题的完整指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一而烦恼吗?BetterNCM…

2026/8/12 13:12:18 阅读更多 →
从Tool Use到AI Agent:技术原理、局限与未来探索

从Tool Use到AI Agent:技术原理、局限与未来探索

1. 从“缸中大脑”到AI Agent:一场关于智能本质的追问最近和几个做AI的朋友聊天,大家不约而同地提到了一个词:“Tool Use”(工具使用)。这听起来平平无奇,不就是让AI调用个API、查个天气、发个邮件吗&#…

2026/8/12 13:12:18 阅读更多 →

最新新闻

开源力量如何让你永久解锁IDM下载管理器的完整功能?

开源力量如何让你永久解锁IDM下载管理器的完整功能?

开源力量如何让你永久解锁IDM下载管理器的完整功能? 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 在数字时代,下载管理软件已经成为我们…

2026/8/12 14:04:19 阅读更多 →
小白猫项目实战:打造个性化AI助手,从角色卡到记忆库的完整指南

小白猫项目实战:打造个性化AI助手,从角色卡到记忆库的完整指南

最近在 AI 领域,一个名为“小白猫”的项目突然引起了开发者和技术爱好者的的高度关注。它不像那些动辄千亿参数、需要庞大算力集群的大模型,而是以一种更轻巧、更聚焦的方式,试图解决一个具体而微妙的痛点: 如何让 AI 助手在特定…

2026/8/12 14:04:19 阅读更多 →
豆瓣9.3!这7部科幻电影,每一部都改变了世界”

豆瓣9.3!这7部科幻电影,每一部都改变了世界”

你好呀! 《2001太空漫游》里有句台词说:我的上帝,这满天的星星,全是宇宙。每次抬头看星星的时候,我总会想起这句话。 科幻电影最迷人的地方,从来不是特效有多炫酷,而是它们让我们在两个小时里&a…

2026/8/12 14:04:19 阅读更多 →
AI绘画进阶:从模型下载到高质量出图的系统性工作流指南

AI绘画进阶:从模型下载到高质量出图的系统性工作流指南

你打开一个模型发布页面,标题是“镇守深暗古城的修女 监守者娘登场!【YSM模型发布】”。页面里可能只有几张预览图、一个下载链接,或者再加上几句充满氛围感的描述。你下载了模型,加载到你的AI绘画工具里,输入几个关键…

2026/8/12 14:04:18 阅读更多 →
Claude Code模式全解析:从交互界面到任务指令的高效编程指南

Claude Code模式全解析:从交互界面到任务指令的高效编程指南

1. 项目概述:从“模式”的混乱到清晰如果你最近在折腾Claude Code,或者任何类似的AI编程助手,大概率会被一个词搞晕:模式。无论是官方文档、社区讨论还是各种教程,“模式”这个词出现的频率高得吓人。一会儿是“编辑模…

2026/8/12 14:04:18 阅读更多 →
Windows+VS2019快速配置Open3D C++开发环境:避坑指南与实战

Windows+VS2019快速配置Open3D C++开发环境:避坑指南与实战

1. 项目概述:为什么要在Windows上用VS2019搞Open3D C?如果你正在做三维点云处理、三维重建或者计算机视觉相关的开发,大概率听说过Open3D这个库。它是一个开源的3D数据处理库,功能强大,支持点云、网格、RGB-D图像等多种…

2026/8/12 14:03:18 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →