利用LocalStorage实现购物车总价计算:JavaScript实践指南

利用LocalStorage实现购物车总价计算:JavaScript实践指南

本文将详细介绍如何使用javascript和localstorage来准确计算购物车中商品的总价。核心挑战在于localstorage存储的数据均为字符串,进行算术运算前必须进行类型转换。我们将通过分析常见错误、提供正确的实现方案,并探讨数据校验、事件优化以及更合理的数据存储结构,帮助开发者构建健壮的购物车总价计算功能。

LocalStorage与数据类型转换的必要性

在Web开发中,localStorage 提供了一种在浏览器中持久化存储键值对数据的方法,即使浏览器关闭后数据也不会丢失。然而,localStorage 存储的所有值都是字符串类型。这意味着,当你从 localStorage 中获取数值型数据(如商品价格或数量)时,它们仍将以字符串的形式返回。如果直接对这些字符串进行加法运算,JavaScript 会执行字符串拼接而不是数学加法,导致计算结果不正确。

例如,如果你存储了 ‘10.50’ 和 ‘20.00’,直接相加 localStorage.getItem(“price1”) + localStorage.getItem(“price2”) 的结果将是 ‘10.5020.00’,而非预期的 30.50。因此,在进行任何算术运算之前,必须将从 localStorage 获取的字符串显式转换为数字类型。常用的转换方法有 parseFloat() (适用于浮点数) 或 parseInt() (适用于整数)。

常见错误分析与纠正

开发者在尝试计算总价时,常会遇到以下问题:

错误的键名拼接: 试图通过拼接键名来获取多个值,例如 localStorage.getItem(‘prod_value’ + ‘prod2_value’)。这种做法是错误的,localStorage.getItem() 只能接受一个完整的、已存在的键名。正确的做法是分别获取每个键对应的值。遗漏类型转换: 从 localStorage 获取值后直接进行加法运算,导致字符串拼接。

错误的示例代码(基于常见问题):

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

// 假设prod_value和prod2_value在localStorage中存储为字符串// 例如: localStorage.setItem("prod_value", "10.50");//       localStorage.setItem("prod2_value", "20.00");document.querySelector("#updateCart").addEventListener('click', function() {  // 错误示范1: 试图拼接键名获取值  // 这将尝试获取一个名为 "prod_valueprod2_value" 的localStorage项,通常不存在  document.querySelector('#total').innerText = localStorage.getItem('prod_value' + 'prod2_value');  // 错误示范2: 未进行类型转换,导致字符串拼接  let valueOne = localStorage.getItem("prod_value"); // "10.50" (string)  let valueTwo = localStorage.getItem("prod2_value"); // "20.00" (string)  let total = valueOne + valueTwo; // 结果将是 "10.5020.00" (string)  document.querySelector('#total').innerText = total;});

正确实现购物车总价计算

为了正确计算总价,我们需要遵循以下步骤:

获取数据: 使用 localStorage.getItem(key) 分别获取每个商品的价格或价值。类型转换: 使用 parseFloat() 或 parseInt() 将获取到的字符串值转换为数字。考虑到商品价格通常为浮点数,parseFloat() 是更合适的选择。执行计算: 对转换后的数字进行加法运算。更新UI: 将计算结果显示在页面上。

示例代码:

// 模拟localStorage中的数据localStorage.setItem("prod_value", "10.50"); // 商品1价格localStorage.setItem("prod_qty", "2");       // 商品1数量localStorage.setItem("prod_size", "M");      // 商品1尺寸localStorage.setItem("prod2_value", "25.99"); // 商品2价格localStorage.setItem("prod2_qty", "1");       // 商品2数量localStorage.setItem("prod2_size", "L");      // 商品2尺寸// 假设页面上存在 #updateCart 按钮和用于显示信息的元素// // 

商品1价值:

//

商品1数量:

//

商品1尺寸:

ASP.NET 4.0电子商城
ASP.NET 4.0电子商城

在现实生活中的购物过程,购物者需要先到商场,找到指定的产品柜台下,查看产品实体以及标价信息,如果产品合适,就将该产品放到购物车中,到收款处付款结算。电子商务网站通过虚拟网页的形式在计算机上摸拟了整个过程,首先电子商务设计人员将产品信息分类显示在网页上,用户查看网页上的产品信息,当用户看到了中意的产品后,可以将该产品添加到购物车,最后使用网上支付工具进行结算,而货物将由公司通过快递等方式发送给购物者

ASP.NET 4.0电子商城 0
查看详情 ASP.NET 4.0电子商城
//

商品2价值:

//

商品2数量:

//

商品2尺寸:

//

购物车总价:

document.querySelector("#updateCart").addEventListener('click', function() { // 获取并更新商品1信息 const prod1ValueStr = localStorage.getItem("prod_value"); const prod1QtyStr = localStorage.getItem("prod_qty"); const prod1SizeStr = localStorage.getItem("prod_size"); document.querySelector('#prod_value').innerText = prod1ValueStr || '0.00'; document.querySelector('#prod_qty').innerText = prod1QtyStr || '0'; document.querySelector('#prod_size').innerText = prod1SizeStr || ''; // 获取并更新商品2信息 const prod2ValueStr = localStorage.getItem("prod2_value"); const prod2QtyStr = localStorage.getItem("prod2_qty"); const prod2SizeStr = localStorage.getItem("prod2_size"); document.querySelector('#prod2_value').innerText = prod2ValueStr || '0.00'; document.querySelector('#prod2_qty').innerText = prod2QtyStr || '0'; document.querySelector('#prod2_size').innerText = prod2SizeStr || ''; // 计算总价 // 1. 获取字符串值 let valueOneStr = localStorage.getItem("prod_value"); let valueTwoStr = localStorage.getItem("prod2_value"); // 2. 类型转换,并处理可能不存在的情况(返回null或非数字字符串) // 如果getItem返回null,parseFloat会得到NaN。通过 || 0 确保结果为数字。 let valueOne = parseFloat(valueOneStr) || 0; let valueTwo = parseFloat(valueTwoStr) || 0; // 3. 执行计算 let total = valueOne + valueTwo; // 4. 更新UI // 可以使用 toFixed(2) 格式化为两位小数 document.querySelector('#total').innerText = total.toFixed(2);});

注意事项与优化建议

数据校验与默认值:localStorage.getItem() 在对应的键不存在时会返回 null。parseFloat(null) 会得到 NaN(Not a Number)。因此,在进行类型转换时,应始终考虑提供一个默认值,以防止计算出错。例如 parseFloat(valueStr) || 0。

事件监听优化:避免为同一个元素和同一个事件类型多次绑定事件监听器。在用户提供的原始代码中,#updateCart 按钮被绑定了三次点击事件。这不仅效率低下,而且可能导致意外的行为。应将所有相关的逻辑整合到一个事件监听器中。

浮点数精度问题:JavaScript 在处理浮点数时可能存在精度问题(例如 0.1 + 0.2 !== 0.3)。对于货币计算,这可能导致微小的误差。一种常见的解决方案是将所有金额转换为整数(例如,将元转换为分),进行计算后再转换回浮点数。

// 示例:避免浮点数精度问题let price1Cents = Math.round(parseFloat(valueOneStr) * 100) || 0;let price2Cents = Math.round(parseFloat(valueTwoStr) * 100) || 0;let totalCents = price1Cents + price2Cents;let total = (totalCents / 100).toFixed(2); // 格式化为两位小数

购物车数据结构优化:当前示例为每个商品的每个属性(价格、数量、尺寸)都单独存储了一个 localStorage 项。这对于少量商品尚可,但当购物车商品种类增多时,管理会变得非常复杂。更推荐的做法是将整个购物车作为一个 JSON 字符串存储在 localStorage 中。

示例:更优的购物车数据结构

// 存储购物车数据const cartItems = [  { id: 'prod1', name: '商品A', price: 10.50, qty: 2, size: 'M' },  { id: 'prod2', name: '商品B', price: 25.99, qty: 1, size: 'L' }];localStorage.setItem("shoppingCart", JSON.stringify(cartItems));// 获取并计算总价document.querySelector("#updateCart").addEventListener('click', function() {  const storedCart = localStorage.getItem("shoppingCart");  let total = 0;  if (storedCart) {    const items = JSON.parse(storedCart);    items.forEach(item => {      // 确保price和qty是数字,并处理可能不存在的情况      const price = parseFloat(item.price) || 0;      const qty = parseInt(item.qty) || 0;      total += price * qty;    });  }  document.querySelector('#total').innerText = total.toFixed(2);  // 也可以在这里遍历items,更新页面上每个商品的显示});

这种方式使购物车数据的管理更加集中和灵活,易于添加、删除或修改商品。

总结

通过本文的讲解,我们理解了使用 localStorage 计算购物车总价时,数据类型转换的关键性。核心在于将从 localStorage 获取的字符串值通过 parseFloat() 或 parseInt() 转换为数字,再进行算术运算。同时,为了构建更健壮、可维护的代码,我们应注意数据校验、优化事件监听、处理浮点数精度问题,并考虑采用更合理的数据结构来存储复杂的购物车信息。遵循这些最佳实践,可以有效避免常见的错误,并提升用户体验。

以上就是利用LocalStorage实现购物车总价计算:JavaScript实践指南的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Doctrine复杂实体继承映射错误及Attribute解决方案
上一篇 2025年12月12日 13:25:49
PHP Discord OAuth2 授权:解决令牌交换请求无响应问题
下一篇 2025年12月12日 13:26:00

相关推荐

  • 360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口

    360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口

    360极速浏览器手机版可通过搜索框二维码图标或底部工具栏“更多”按钮进入扫一扫功能,授权相机后对准二维码即可快速识别并跳转页面。 如果您需要在手机上快速扫描二维码以访问链接或获取信息,360极速浏览器手机版提供了便捷的扫一扫功能。以下是具体的操作方法和使用入口。 本文运行环境:小米14,Androi…

    2026年9月27日 • 用户投稿
    000
  • Spring Boot 的自动配置原理是什么?(@SpringBootApplication)

    Spring Boot 的自动配置原理是什么?(@SpringBootApplication)Spring Boot 的自动配置原理是什么?(@SpringBootApplication)Spring Boot 的自动配置原理是什么?(@SpringBootApplication)Spring Boot 的自动配置原理是什么?(@SpringBootApplication)

    Spring Boot自动配置基于“约定优于配置”和“有主见但可扩展”的设计哲学,通过@SpringBootApplication注解整合@Configuration、@ComponentScan和@EnableAutoConfiguration,实现组件自动装配。其核心是@EnableAutoCo…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示

    sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示

    启用LSP插件并配置语言服务器,可使Sublime Text补全菜单显示函数签名、参数、类型及文档等详细信息,提升编码效率。 Sublime Text 默认的自动补全菜单只显示简单的函数名或变量名,信息有限。想要让补全项显示更多上下文信息(如参数列表、类型、文档摘要等),可以通过配置设置和安装插件来…

    2026年9月27日 • 用户投稿
    000
  • uc浏览器下载任务失败怎么解决_UC浏览器下载中断或失败处理方法

    uc浏览器下载任务失败怎么解决_UC浏览器下载中断或失败处理方法uc浏览器下载任务失败怎么解决_UC浏览器下载中断或失败处理方法uc浏览器下载任务失败怎么解决_UC浏览器下载中断或失败处理方法uc浏览器下载任务失败怎么解决_UC浏览器下载中断或失败处理方法

    下载失败时,先检查网络连接,确保信号稳定;清理UC浏览器缓存数据;确认设备存储空间充足;删除失败任务并重新下载;关闭省电模式,允许后台运行以提升稳定性。 如果您在使用UC浏览器下载文件时遇到下载任务失败或中断的情况,可能是由于网络连接不稳定、存储空间不足或浏览器缓存异常导致的。以下是针对此问题的多种…

    2026年9月27日 • 用户投稿
    000
  • 什么是泛型?泛型擦除是什么意思?有什么好处和局限?

    什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?什么是泛型?泛型擦除是什么意思?有什么好处和局限?

    泛型通过类型参数提升代码复用与编译期类型安全,Java采用泛型擦除机制以兼容旧版本并简化JVM,但导致运行时无法获取泛型信息,需通过Class对象、通配符、类型令牌等策略应对。 泛型,简单来说,就是我们在编写代码时,能够让方法、类或接口处理多种数据类型的一种能力。它就像给我们的代码加了一层“智能外壳…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么处理超大日志文件_sublime超大日志文件处理技巧

    sublime怎么处理超大日志文件_sublime超大日志文件处理技巧sublime怎么处理超大日志文件_sublime超大日志文件处理技巧sublime怎么处理超大日志文件_sublime超大日志文件处理技巧sublime怎么处理超大日志文件_sublime超大日志文件处理技巧

    通过设置大文件提示阈值和关闭高亮索引功能,可提升Sublime Text处理大日志文件的性能;2. 启用只读模式并分段查看,结合外部工具拆分文件,能有效避免卡顿崩溃;3. 对于GB级日志,建议配合Less、LogExpert等专用工具使用以获得更佳效率。 Sublime Text 虽然轻量高效,但在…

    2026年9月27日 • 用户投稿
    000
  • qq浏览器如何更新到最新版本 QQ浏览器手动检查与自动更新设置

    qq浏览器如何更新到最新版本 QQ浏览器手动检查与自动更新设置qq浏览器如何更新到最新版本 QQ浏览器手动检查与自动更新设置qq浏览器如何更新到最新版本 QQ浏览器手动检查与自动更新设置qq浏览器如何更新到最新版本 QQ浏览器手动检查与自动更新设置

    更新QQ浏览器可解决功能异常问题。①通过“我的-设置-关于”手动检查更新;②官网下载最新安装包覆盖安装;③在设置和应用商店中开启自动更新功能,确保版本同步。 如果您发现QQ浏览器功能异常或无法正常加载网页,可能是由于浏览器版本过低导致与当前网站技术不兼容。及时更新至最新版本可以修复已知漏洞并提升浏览…

    2026年9月27日 • 用户投稿
    300
  • 多核处理器在运行单线程任务时为何表现不佳?

    多核处理器在运行单线程任务时为何表现不佳?多核处理器在运行单线程任务时为何表现不佳?多核处理器在运行单线程任务时为何表现不佳?多核处理器在运行单线程任务时为何表现不佳?

    多核处理器在运行单线程任务时表现不佳,根本原因在于任务的串行性使其无法并行执行,即便拥有更多核心也难以提升性能。1. 单线程任务只能在一个核心上运行,其他核心无法参与;2. 任务内部存在严格的顺序依赖(如A→B→C),导致无法拆分并行处理;3. 根据Amdahl定律,程序加速比受限于串行部分比例,纯…

    2026年9月27日 • 用户投稿
    500
  • ️「领域驱动设计」Java微服务拆分策略与界限上下文划分

    ️「领域驱动设计」Java微服务拆分策略与界限上下文划分️「领域驱动设计」Java微服务拆分策略与界限上下文划分️「领域驱动设计」Java微服务拆分策略与界限上下文划分️「领域驱动设计」Java微服务拆分策略与界限上下文划分

    微服务拆分的核心在于通过领域驱动设计(DDD)识别业务的“自然边界”,其中界限上下文(Bounded Context)是关键。它强调从业务语言和领域专家沟通出发,而非技术视角,确保服务高内聚、低耦合。通过事件风暴、通用语言、业务能力分析等方法识别界限上下文,并结合团队结构与上下文映射明确服务边界。在…

    2026年9月26日 • 用户投稿
    100
  • 如何正确配置防火墙规则以平衡安全与性能?

    如何正确配置防火墙规则以平衡安全与性能?如何正确配置防火墙规则以平衡安全与性能?如何正确配置防火墙规则以平衡安全与性能?如何正确配置防火墙规则以平衡安全与性能?

    答案是:防火墙规则需基于最小权限和默认拒绝原则,结合网络拓扑细化规则、定期审计清理僵尸规则,并利用日志监控优化性能与安全;在云环境则需借助自动化工具实现分布式、细粒度的动态防护。 配置防火墙规则以平衡安全与性能,这从来就不是一个一劳永逸的事情,它更像是一场持续的拉锯战。核心在于,你必须清楚地知道自己…

    2026年9月26日 • 用户投稿
    000
  • 系统安装完成后,用什么工具批量安装驱动最方便?

    系统安装完成后,用什么工具批量安装驱动最方便?系统安装完成后,用什么工具批量安装驱动最方便?系统安装完成后,用什么工具批量安装驱动最方便?系统安装完成后,用什么工具批量安装驱动最方便?

    集成式驱动管理软件虽能快速安装驱动,但存在捆绑软件、驱动版本过时、隐私安全风险及系统不稳定等问题。建议仅用其解决网卡驱动等燃眉之急,后续优先从主板、显卡等设备官网下载匹配驱动,通过Windows Update补充基础驱动,并按芯片组→网卡→显卡→声卡顺序安装。安装后需检查设备管理器状态,进行功能测试…

    2026年9月26日 • 用户投稿
    100
  • PHP中动态设置HTML 背景色的正确实践

    <img src="https://img.php.cn/upload/article/001/246/273/175965168921241.jpg" alt="php中动态设置html 背景色的正确实践”>背景色的正确实践” /&…

    用户投稿 2026年9月26日
    100
  • 小红书网页版怎么安全退出_小红书网页版账号安全退出教程

    小红书网页版怎么安全退出_小红书网页版账号安全退出教程小红书网页版怎么安全退出_小红书网页版账号安全退出教程小红书网页版怎么安全退出_小红书网页版账号安全退出教程小红书网页版怎么安全退出_小红书网页版账号安全退出教程

    小红书网页版安全退出需点击右上角头像,在下拉菜单中选择“退出登录”,退出后建议清除浏览器缓存与历史记录,并关闭无痕浏览窗口,同时定期修改密码、开启短信验证以提升账号安全性。 小红书网页版怎么安全退出?这是不少网友在使用公共设备或共享电脑时常关注的问题,接下来由PHP小编为大家带来小红书网页版账号安全…

    2026年9月26日 • 用户投稿
    200
  • Maven进阶实战:多模块项目依赖管理与冲突解决

    Maven进阶实战:多模块项目依赖管理与冲突解决Maven进阶实战:多模块项目依赖管理与冲突解决Maven进阶实战:多模块项目依赖管理与冲突解决Maven进阶实战:多模块项目依赖管理与冲突解决

    答案:Maven多模块项目依赖管理核心在于父POM中使用统一版本、合理划分模块实现高内聚低耦合、通过排除冲突传递依赖,并利用mvn dependency:tree等工具分析依赖树,结合BOM引入、版本属性化管理等策略,确保依赖一致性与项目可维护性。 Maven多模块项目中的依赖管理与冲突解决,核心在…

    2026年9月26日 • 用户投稿
    300
  • Java泛型陷阱:Pair中List类型丢失问题及解决方案

    Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案

    本文探讨了在Java中使用包含List的Pair时,若迭代循环中未正确使用泛型,可能导致List类型信息丢失的问题。核心在于,使用裸类型(Raw Type)的Pair会导致其内部泛型参数被擦除为Object,从而无法访问List特有的方法。解决方案是在循环声明中明确指定泛型类型,以确保编译时类型安全…

    2026年9月26日 • 用户投稿
    300
  • qq浏览器游戏模式怎么开启 QQ浏览器游戏模式与性能加速设置

    qq浏览器游戏模式怎么开启 QQ浏览器游戏模式与性能加速设置qq浏览器游戏模式怎么开启 QQ浏览器游戏模式与性能加速设置qq浏览器游戏模式怎么开启 QQ浏览器游戏模式与性能加速设置qq浏览器游戏模式怎么开启 QQ浏览器游戏模式与性能加速设置

    开启游戏模式可解决QQ浏览器游戏卡顿问题。1、进入“我的”→“设置”→“实验室功能”,开启“游戏模式”。2、打开H5游戏页面,点击地址栏“极速模式”标识启用加速。3、在“浏览加速”中开启“智能预加载”“高性能渲染”和“后台进程清理”以优化性能。 如果您在使用QQ浏览器玩游戏时遇到卡顿或加载缓慢的问题…

    2026年9月26日 • 用户投稿
    000
  • 使用泛型解决Pair中List无法访问的问题

    使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题

    本文介绍了在使用 javatuples 库中的 Pair 类时,当 Pair 的第二个元素是 List 类型,并且在循环中访问该 List 时,可能遇到的无法访问 List 的 size() 方法或元素的问题。通过在循环中使用泛型来明确 Pair 中 List 的类型,可以有效解决此问题,确保 Li…

    2026年9月26日 • 用户投稿
    100
  • firefox官网首页入口 火狐浏览器手机版免费下载地址

    firefox官网首页入口 火狐浏览器手机版免费下载地址firefox官网首页入口 火狐浏览器手机版免费下载地址firefox官网首页入口 火狐浏览器手机版免费下载地址firefox官网首页入口 火狐浏览器手机版免费下载地址

    火狐浏览器官网首页入口是https://www.mozilla.org/zh-CN/firefox/new/,该页面提供手机版免费下载链接,并介绍其核心特性如阻止跟踪器、沙盒技术、多设备同步和隐私浏览模式。 firefox官网首页入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来火狐浏览…

    2026年9月26日 • 用户投稿
    100
  • vivo浏览器为什么打不开网页_vivo浏览器无法加载网页原因分析

    vivo浏览器为什么打不开网页_vivo浏览器无法加载网页原因分析vivo浏览器为什么打不开网页_vivo浏览器无法加载网页原因分析vivo浏览器为什么打不开网页_vivo浏览器无法加载网页原因分析vivo浏览器为什么打不开网页_vivo浏览器无法加载网页原因分析

    首先检查网络连接,尝试切换Wi-Fi与移动数据,重启路由器,并测试其他应用联网情况;若问题仍在,清除浏览器缓存与数据,检查DNS设置并更改为8.8.8.8和114.114.114.114;确认浏览器已授予网络和位置权限;更新或重装vivo浏览器;最后可尝试还原网络设置以解决深层配置错误。 如果您在使…

    2026年9月26日 • 用户投稿
    000
  • Java中Pair嵌套List时泛型丢失问题解析与最佳实践

    Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践

    本文深入探讨了在Java中使用org.javatuples.Pair嵌套List时,因不当使用泛型(即使用原始类型)导致List功能异常的问题。通过分析原始类型Pair在增强型for循环中的行为,揭示了类型擦除如何影响内部List的访问。文章提供了正确的泛型使用方式,确保在迭代过程中List的类型信…

    2026年9月26日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信