使用 JavaScript LocalStorage 实现计算器数字历史记录

使用 javascript localstorage 实现计算器数字历史记录

本文将介绍如何利用 JavaScript 的 LocalStorage 功能,为计算器实现一个简单的数字历史记录功能。该功能可以保存用户最近输入的 5 个数字,并在每次输入新数字时,将最早的数字移除,从而实现一个类似队列的历史记录效果。通过本文的学习,你将掌握 LocalStorage 的基本用法,以及如何将其应用到实际的 Web 开发场景中。

使用 LocalStorage 存储计算器数字历史

LocalStorage 是 Web 浏览器提供的一种本地存储机制,允许 Web 应用程序在用户的浏览器中存储键值对数据。这些数据在浏览器关闭后仍然保留,直到被显式删除。这使得 LocalStorage 非常适合存储用户偏好设置、应用程序状态等数据。

对于计算器数字历史记录功能,我们可以使用 LocalStorage 来存储一个包含最近输入数字的数组。每次用户输入一个新数字,我们就将该数字添加到数组的开头,并移除数组末尾的数字(如果数组长度超过 5)。

实现步骤

HTML 结构:

首先,我们需要一个包含数字按钮的 HTML 结构。例如:

立即学习“Java免费学习笔记(深入)”;

JavaScript 代码:

接下来,我们需要编写 JavaScript 代码来处理数字输入和 LocalStorage 的存储。

window.addEventListener("DOMContentLoaded", () => {  // 从 LocalStorage 加载数字历史记录,如果不存在则创建一个空数组  const arr = JSON.parse(localStorage.getItem("arr") || "[]");  // 保存数字到 LocalStorage 的函数  const saveNumber = (num) => {    arr.unshift(num); // 将新数字添加到数组开头    if (arr.length === 6) arr.pop(); // 如果数组长度超过 5,移除末尾的数字    localStorage.setItem("arr", JSON.stringify(arr)); // 将数组保存到 LocalStorage    console.log("Current History:", arr); // 打印当前历史记录  };  // 为计算器按钮添加事件监听器  document.getElementById("calculator").addEventListener("click", (e) => {    const tgt = e.target.closest("button.num"); // 获取点击的按钮元素    if (!tgt) return; // 如果点击的不是数字按钮,则返回    saveNumber(+tgt.textContent); // 将按钮的文本内容转换为数字并保存  });});

代码解释:

window.addEventListener(“DOMContentLoaded”, …): 确保在页面加载完成后执行代码。JSON.parse(localStorage.getItem(“arr”) || “[]”): 从 LocalStorage 中获取名为 “arr” 的数据。如果 “arr” 不存在,则使用空数组 [] 作为默认值。JSON.parse 将 JSON 字符串转换为 JavaScript 数组。saveNumber(num): 该函数负责将数字保存到 LocalStorage。arr.unshift(num): 将新数字 num 添加到数组 arr 的开头。if (arr.length === 6) arr.pop(): 如果数组的长度达到 6,则移除数组末尾的元素,保持数组长度为 5。localStorage.setItem(“arr”, JSON.stringify(arr)): 将更新后的数组 arr 转换为 JSON 字符串,并将其保存到 LocalStorage 中,键名为 “arr”。document.getElementById(“calculator”).addEventListener(“click”, …): 为 calculator 元素添加点击事件监听器。e.target.closest(“button.num”): 查找最近的父元素,该元素是具有 num 类的 button 元素。if (!tgt) return: 如果点击的不是数字按钮,则直接返回,不执行任何操作。saveNumber(+tgt.textContent): 将点击的按钮的文本内容(例如 “1”, “2”)转换为数字(使用 + 运算符),然后调用 saveNumber 函数将其保存到 LocalStorage。

注意事项

LocalStorage 只能存储字符串数据。因此,我们需要使用 JSON.stringify 将数组转换为 JSON 字符串,再将其存储到 LocalStorage 中。读取数据时,需要使用 JSON.parse 将 JSON 字符串转换回 JavaScript 数组。LocalStorage 的存储空间有限,通常为 5MB 到 10MB。因此,不适合存储大量数据。用户可以清除浏览器的 LocalStorage 数据。因此,不要依赖 LocalStorage 存储关键数据。console.log(“Current History:”, arr): 在实际应用中,你可以将历史记录显示在页面上,而不是仅仅打印在控制台中。

总结

通过本文的教程,你学习了如何使用 JavaScript 的 LocalStorage 功能来实现一个简单的计算器数字历史记录功能。你可以根据自己的需求,修改和扩展这个功能,例如,增加历史记录的长度,或者将历史记录显示在页面上。LocalStorage 是一个非常有用的 Web 存储机制,可以帮助你构建更丰富的 Web 应用程序。

以上就是使用 JavaScript LocalStorage 实现计算器数字历史记录的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1510270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 05:51:34
下一篇 2025年12月20日 05:51:47

相关推荐

  • async函数中的并行与串行控制

    并行处理适用于无依赖任务,使用promise.all()或promise.allsettled()实现;串行处理用于需顺序执行的场景,可通过循环或reduce链式调用完成;有限并发控制可借助任务队列和并发计数器平衡效率与资源占用。 在异步函数的世界里,并行与串行控制是我们日常编码中不可或缺的考量。简…

    2025年12月20日 好文分享
    000
  • async函数中的并发执行控制

    并发控制在async函数中的核心目的是避免资源耗尽、接口限流或服务崩溃,通过限制同时运行的异步任务数量来维持系统稳定。1. 基于计数器和队列的自定义实现通过维护任务队列和执行计数器动态管理任务执行;2. 使用promise.all结合分块处理适用于固定任务列表的场景,将任务分为小批次串行执行;3. …

    2025年12月20日 好文分享
    000
  • ES6的Error子类如何自定义错误类型

    自定义es6错误类型能提升代码质量与错误处理的精确性。通过继承error类,开发者可创建具有语义化名称和附加上下文信息的错误类型,如validationerror和networkerror,从而告别模糊的错误提示。使用class语法定义错误类型时,需在构造函数中调用super()并设置name属性,…

    2025年12月20日 好文分享
    000
  • 如何使用 JavaScript 检测线段与圆的相交

    本文详细介绍了如何使用 JavaScript 检测线段与圆是否相交。通过计算线段到圆心的最近距离,并与圆的半径进行比较,可以有效地判断是否存在交点。文章提供了两种实现方法,一种避免了昂贵的平方根运算,另一种则能计算出交点距离。同时,提供了可运行的示例代码,方便读者理解和应用。 线段与圆相交检测的原理…

    2025年12月20日
    000
  • 如何处理JavaScript中的异步错误

    javascript中处理异步错误的核心方法包括使用async/await结合try/catch、promise的.catch()方法、promise.allsettled()以及全局错误监听机制。1. async/await与try/catch结合能以同步方式捕获异步错误,适用于现代异步编程;2.…

    2025年12月20日 好文分享
    000
  • ES6中如何用数组的flatMap方法映射并展平

    flatmap为何出现?1.解决映射后展平常见场景,避免map+flat两步操作;2.提升代码可读性与意图表达清晰度;3.潜在性能优化,减少中间数组生成。flatmap是map后接flat(1)的语法糖,对每个元素应用回调并展平一层,使代码更简洁高效。例如,插入分隔项或提取多标签时,flatmap能…

    2025年12月20日 好文分享
    000
  • JavaScript如何用数组的at方法获取末尾元素

    在javascript中,数组的at()方法通过负数索引(如-1)更直观地获取末尾元素。传统方式需使用arr[arr.length – 1]进行计算,而at(-1)直接表达“获取最后一个元素”的意图,提升可读性;它支持链式调用,适用于复杂表达式、倒数任意元素获取、函数式编程风格及处理空数…

    2025年12月20日 好文分享
    000
  • JavaScript 教程:检测线段与圆的相交

    本教程详细介绍了如何使用 JavaScript 检测线段与圆是否相交。通过避免使用平方根运算,提供了一种高效的相交检测方法。同时,还提供了一个进阶函数,用于计算线段与圆的交点距离,并附带完整的代码示例和演示,帮助开发者理解和应用这些技术。 在 HTML5 Canvas 游戏中,碰撞检测是至关重要的一…

    2025年12月20日
    000
  • JavaScript的this关键字是什么?如何正确使用?

    javascript中的this指向函数执行时的上下文,1. 默认绑定中,非严格模式下this指向全局对象,严格模式下为undefined;2. 隐式绑定中,this指向调用方法的对象;3. 显式绑定通过call、apply或bind指定this值;4. new绑定将this绑定到新创建的对象;5.…

    2025年12月20日 好文分享
    000
  • JavaScript中异步数据加载策略

    javascript中处理异步数据加载的核心在于避免阻塞主线程,确保界面流畅。1. 回调函数简单但易形成“回调地狱”,适合简单场景;2. promise通过.then()和.catch()实现链式调用,解决嵌套问题,提升可维护性;3. async/await基于promise,以同步方式写异步代码,…

    2025年12月20日 好文分享
    000
  • React onKeyDown事件中状态更新延迟问题详解

    本文旨在解决React中onKeyDown事件处理函数内部状态更新延迟的问题。通过分析问题原因,并结合useEffect Hook,提供一种确保状态及时更新的解决方案。帮助开发者避免在事件处理中遇到的状态同步难题,提升用户交互体验。 在React开发中,我们经常需要在事件处理函数中更新组件的状态。然…

    2025年12月20日
    000
  • JavaScript的Object.values方法是什么?如何使用?

    object.values()用于提取对象中所有可枚举的自有属性值并返回数组。它只处理字符串键,忽略symbol键、不可枚举属性和原型链属性。1. 用法为object.values(obj),返回值数组顺序在现代引擎中通常可预测,遵循插入顺序与整数键排序规则;2. 结合数组方法如filter、map…

    2025年12月20日 好文分享
    000
  • BOM的back方法有什么用?如何用它返回上一页?

    back()方法是bom中用于模拟浏览器“后退”按钮行为的方法,属于window.history对象的一部分;它通过弹出历史堆栈顶部的url,使浏览器回到上一个页面;调用方式为window.history.back(),常绑定于按钮点击事件;该方法与浏览器历史记录紧密相关,依赖于history对象维…

    2025年12月20日 好文分享
    000
  • JavaScript事件委托:精确获取动态生成子元素的点击目标

    本教程探讨在JavaScript事件委托中,如何准确地定位并获取动态生成子元素的点击目标。当元素通过异步操作或其他方式动态添加到DOM后,直接使用document.querySelector可能导致始终获取第一个匹配元素的问题。文章将详细解释这一常见误区,并提供利用e.target作为查询上下文的正…

    2025年12月20日
    000
  • JavaScript中的闭包是什么?如何实际应用?

    闭包是javascript中函数与其词法环境的组合,使内部函数能访问并记住外部函数的变量,即使外部函数已执行完毕。1. 闭包通过函数定义时的[[environment]]属性保持对外部变量的引用,阻止其被垃圾回收,实现数据私有化和持久化;2. 常见应用场景包括数据封装(如创建私有变量)、函数柯里化(…

    2025年12月20日 好文分享
    000
  • 精准定位动态元素:JavaScript事件委托与DOM遍历技巧

    在JavaScript中处理动态创建元素的点击事件时,常常会遇到e.target无法准确指向所需内容的问题。本文将深入探讨事件委托机制,并详细解析document.querySelector在处理动态内容时的常见陷阱。通过对比e.target.querySelector()和更具鲁棒性的closes…

    2025年12月20日
    000
  • 如何用async函数简化异步逻辑

    async函数和await关键字通过将异步代码以同步方式书写,极大提升了可读性和可维护性。1. async函数用于声明包含异步操作的函数,自动返回promise;2. await用于等待promise解决,暂停函数执行直到结果返回;3. 错误可用try…catch捕获,提升异常处理一致性…

    2025年12月20日 好文分享
    000
  • JavaScript的sessionStorage是什么?如何使用?

    sessionstorage是浏览器提供的临时存储机制,数据生命周期绑定当前标签页,关闭即清除。1.用于跨页面或刷新后保持临时数据,如多步骤表单暂存、spa状态管理;2.区别于localstorage,sessionstorage仅在当前会话有效且作用域限于当前标签页;3.使用时需注意:仅存储非敏感…

    2025年12月20日 好文分享
    000
  • JavaScript中异步编程的常见误区

    javascript异步编程通过非阻塞机制提升程序效率,但常引发回调地狱、错误未捕获、async/await使用误区及并发控制混乱等问题。1. 回调地狱虽因promise和async/await的引入而形式上缓解,但复杂逻辑下仍可能以新形式存在;2. async函数未按预期执行,常见于忘记使用awa…

    2025年12月20日 好文分享
    000
  • JavaScript的Array.isArray方法是什么?怎么用?

    array.isarray() 是 javascript 中用于判断一个值是否为数组的可靠方法。它返回布尔值,若参数是数组则返回 true,否则返回 false。相比 typeof 操作符,array.isarray() 能准确区分数组和对象,因为 typeof 对数组返回的是 “obj…

    2025年12月20日 好文分享
    000

发表回复

登录后才能评论
关注微信