JavaScript字符串操作全解析:从基础概念到性能优化实践
在日常的JavaScript开发中字符串处理占据了相当大的比重。无论是用户输入验证、数据格式化还是文本内容操作都离不开对字符串的熟练掌握。本文将从基础概念出发系统讲解JavaScript字符串的核心特性、常用方法、性能优化以及实际应用场景帮助开发者全面掌握字符串处理技巧。1. JavaScript字符串基础概念1.1 什么是字符串字符串是JavaScript中的基本数据类型之一用于表示文本数据。在JavaScript中字符串可以使用单引号、双引号或反引号来定义。// 三种定义字符串的方式 let str1 单引号字符串; let str2 双引号字符串; let str3 模板字符串;字符串在内存中是以字符序列的形式存储的每个字符都有对应的索引位置从0开始计数。JavaScript使用UTF-16编码来表示字符串这意味着它可以处理各种语言的字符包括中文、日文等。1.2 字符串的不可变性JavaScript中的字符串是不可变的immutable。这意味着一旦字符串被创建就不能直接修改其中的字符。任何看似修改字符串的操作实际上都是创建了一个新的字符串。let str hello; str[0] H; // 这不会改变原字符串 console.log(str); // 输出: hello // 正确的方式是创建新字符串 let newStr H str.slice(1); console.log(newStr); // 输出: Hello理解字符串的不可变性对于编写高效的JavaScript代码至关重要特别是在处理大量字符串操作时。1.3 字符串长度和字符访问可以使用length属性获取字符串的长度使用方括号语法或charAt()方法来访问特定位置的字符。let str JavaScript; console.log(str.length); // 输出: 10 console.log(str[0]); // 输出: J console.log(str.charAt(0)); // 输出: J console.log(str[str.length - 1]); // 输出: t需要注意的是如果使用不存在的索引访问字符方括号语法返回undefined而charAt()方法返回空字符串。2. 字符串创建和模板字符串2.1 基本字符串创建除了直接使用引号创建字符串外还可以使用String构造函数创建字符串对象但通常推荐使用字面量语法。// 字面量方式推荐 let literalStr Hello World; // 构造函数方式 let constructorStr new String(Hello World); console.log(typeof literalStr); // 输出: string console.log(typeof constructorStr); // 输出: object虽然两种方式创建的字符串在值上相同但类型不同。在大多数情况下使用字面量语法更简洁高效。2.2 模板字符串的高级用法ES6引入的模板字符串提供了更强大的字符串处理能力支持多行字符串和字符串插值。// 多行字符串 let multiLineStr 第一行 第二行 第三行 ; // 字符串插值 let name 张三; let age 25; let info 姓名: ${name}, 年龄: ${age}; console.log(info); // 输出: 姓名: 张三, 年龄: 25 // 表达式计算 let a 10, b 20; let result ${a} ${b} ${a b}; console.log(result); // 输出: 10 20 30模板字符串还支持标签模板Tagged Templates可以用于自定义字符串处理逻辑。function highlight(strings, ...values) { let result ; strings.forEach((string, i) { result string; if (i values.length) { result mark${values[i]}/mark; } }); return result; } let name 李四; let score 95; let message highlight学生${name}的考试成绩是${score}分; console.log(message); // 输出: 学生mark李四/mark的考试成绩是mark95/mark分3. 字符串常用操作方法3.1 字符串查找和匹配JavaScript提供了多种字符串查找方法每种方法都有其特定的使用场景。let str JavaScript字符串操作详解; // indexOf和lastIndexOf console.log(str.indexOf(字符串)); // 输出: 10 console.log(str.lastIndexOf(a)); // 输出: 3 // includes、startsWith、endsWith console.log(str.includes(详解)); // 输出: true console.log(str.startsWith(Java)); // 输出: true console.log(str.endsWith(详解)); // 输出: true // match方法使用正则表达式 let matchResult str.match(/[A-Z]/g); console.log(matchResult); // 输出: [J, S]在实际开发中根据具体需求选择合适的方法。如果只需要判断是否存在使用includes()更简洁如果需要获取位置信息使用indexOf()更合适。3.2 字符串截取和分割字符串截取和分割是常见的操作JavaScript提供了多个相关方法。let str JavaScript,Python,Java,C; // 分割字符串 let languages str.split(,); console.log(languages); // 输出: [JavaScript, Python, Java, C] // 截取子字符串 console.log(str.slice(0, 10)); // 输出: JavaScript console.log(str.substring(11, 17)); // 输出: Python console.log(str.substr(18, 4)); // 输出: Java // 注意substr已废弃建议使用slice或substringsplit()方法还支持限制分割次数let str a,b,c,d,e; console.log(str.split(,, 3)); // 输出: [a, b, c]3.3 字符串替换和大小写转换替换操作可以使用replace()方法大小写转换有专门的方法。let str Hello World, hello JavaScript; // 替换操作 console.log(str.replace(hello, Hi)); // 只替换第一个匹配项 console.log(str.replace(/hello/gi, Hi)); // 替换所有匹配项不区分大小写 // 大小写转换 console.log(str.toUpperCase()); // 输出: HELLO WORLD, HELLO JAVASCRIPT console.log(str.toLowerCase()); // 输出: hello world, hello javascript // 首字母大写 function capitalize(str) { return str.charAt(0).toUpperCase() str.slice(1).toLowerCase(); } console.log(capitalize(hello)); // 输出: Helloreplace()方法还支持使用函数进行复杂的替换逻辑let str 价格: $10, 数量: 5; let result str.replace(/\$(\d)/g, function(match, p1) { return (parseInt(p1) * 6.5); }); console.log(result); // 输出: 价格: 65, 数量: 54. 字符串编码和特殊字符处理4.1 Unicode编码处理JavaScript字符串使用UTF-16编码了解编码处理对于国际化应用很重要。let str Hello 世界; // 获取字符的Unicode编码 console.log(str.charCodeAt(6)); // 输出: 19990 (世的编码) console.log(str.codePointAt(6)); // 输出: 19990 // 从编码创建字符 console.log(String.fromCharCode(19990)); // 输出: 世 console.log(String.fromCodePoint(19990)); // 输出: 世 // 处理代理对字符 let emoji ; console.log(emoji.length); // 输出: 2 console.log(emoji.codePointAt(0)); // 输出: 128522对于包含代理对的字符如emoji建议使用codePointAt()和fromCodePoint()方法。4.2 特殊字符和转义序列JavaScript字符串中可以使用转义序列表示特殊字符。// 常见转义序列 let specialStr 第一行\n第二行\t制表符\引号\\反斜杠; console.log(specialStr); // Unicode转义序列 let unicodeStr \u4e16\u754c; // 世界 console.log(unicodeStr); // 输出: 世界 // 模板字符串中的转义 let templateStr 换行符\n制表符\t; console.log(templateStr);在正则表达式中需要注意特殊字符的转义let regex /\.\*\\?\\\(\)\{\}\[\]\^\$/g; let str 特殊字符: .*?\\(){}[]^$; console.log(str.match(regex));5. 字符串性能优化和最佳实践5.1 字符串拼接性能比较不同的字符串拼接方式在性能上有显著差异。// 测试不同拼接方式的性能 function testConcatPerformance() { const iterations 10000; // 使用运算符 console.time(加号拼接); let result1 ; for (let i 0; i iterations; i) { result1 test; } console.timeEnd(加号拼接); // 使用数组join console.time(数组join); let arr []; for (let i 0; i iterations; i) { arr.push(test); } let result2 arr.join(); console.timeEnd(数组join); // 使用模板字符串 console.time(模板字符串); let result3 ; for (let i 0; i iterations; i) { result3 ${result3}test; } console.timeEnd(模板字符串); } testConcatPerformance();对于大量字符串拼接推荐使用数组的join()方法性能最优。5.2 内存优化技巧由于字符串的不可变性频繁操作字符串可能导致内存问题。// 不好的做法频繁创建新字符串 function badPractice(strArray) { let result ; for (let str of strArray) { result str; // 每次循环都创建新字符串 } return result; } // 好的做法使用数组缓存 function goodPractice(strArray) { let parts []; for (let str of strArray) { parts.push(str); } return parts.join(); } // 使用字符串构建器模式 class StringBuilder { constructor() { this.parts []; } append(str) { this.parts.push(str); return this; } toString() { return this.parts.join(); } } let builder new StringBuilder(); builder.append(Hello).append( ).append(World); console.log(builder.toString()); // 输出: Hello World5.3 字符串缓存和复用对于频繁使用的字符串可以考虑缓存机制。// 简单的字符串缓存 const stringCache new Map(); function getCachedString(key, generator) { if (stringCache.has(key)) { return stringCache.get(key); } const value generator(); stringCache.set(key, value); return value; } // 使用示例 const welcomeMessage getCachedString(welcome, () { return 欢迎访问我们的网站当前时间${new Date().toLocaleDateString()}; });6. 实际应用场景案例6.1 用户输入验证和格式化字符串处理在表单验证中非常常见。// 手机号验证和脱敏 function validateAndMaskPhone(phone) { // 去除所有非数字字符 const cleanPhone phone.replace(/\D/g, ); // 验证手机号格式 const phoneRegex /^1[3-9]\d{9}$/; if (!phoneRegex.test(cleanPhone)) { throw new Error(手机号格式不正确); } // 脱敏处理 return cleanPhone.replace(/(\d{3})\d{4}(\d{4})/, $1****$2); } try { const phone 138-1234-5678; const masked validateAndMaskPhone(phone); console.log(masked); // 输出: 138****5678 } catch (error) { console.error(error.message); }6.2 数据格式转换和处理字符串操作在数据转换中发挥重要作用。// CSV数据解析 function parseCSV(csvString) { const lines csvString.split(\n); const result []; const headers lines[0].split(,); for (let i 1; i lines.length; i) { if (lines[i].trim() ) continue; const obj {}; const currentLine lines[i].split(,); for (let j 0; j headers.length; j) { obj[headers[j].trim()] currentLine[j] ? currentLine[j].trim() : ; } result.push(obj); } return result; } const csvData 姓名,年龄,城市 张三,25,北京 李四,30,上海; console.log(parseCSV(csvData));6.3 模板引擎简单实现基于字符串操作可以实现简单的模板引擎。class SimpleTemplate { constructor(template) { this.template template; } render(data) { return this.template.replace(/\{\{(\w)\}\}/g, (match, key) { return data[key] || ; }); } } // 使用示例 const template new SimpleTemplate( div classuser-card h3{{name}}/h3 p年龄: {{age}}/p p城市: {{city}}/p /div ); const userData { name: 王五, age: 28, city: 广州 }; console.log(template.render(userData));7. 常见问题排查和解决方案7.1 编码相关问题字符串编码问题在跨平台开发中经常遇到。// 处理中文乱码问题 function handleEncodingIssues() { // 确保页面编码为UTF-8 const meta document.createElement(meta); meta.setAttribute(charset, UTF-8); document.head.appendChild(meta); // AJAX请求设置编码 fetch(/api/data, { headers: { Content-Type: application/json; charsetutf-8 } }); } // Base64编码解码 function base64Encode(str) { return btoa(unescape(encodeURIComponent(str))); } function base64Decode(base64Str) { return decodeURIComponent(escape(atob(base64Str))); } const chineseStr 中文测试; const encoded base64Encode(chineseStr); console.log(encoded); // 输出Base64编码 console.log(base64Decode(encoded)); // 输出: 中文测试7.2 性能问题排查字符串操作性能问题需要系统性的排查方法。// 内存泄漏检测 function detectMemoryLeaks() { let previousLength 0; const interval setInterval(() { const currentLength JSON.stringify(performance.memory).length; if (currentLength previousLength * 1.5) { console.warn(可能的内存泄漏 detected); } previousLength currentLength; }, 1000); return () clearInterval(interval); } // 字符串操作性能监控 function monitorStringOperations() { const originalStringMethods {}; const methodsToMonitor [replace, split, concat, slice]; methodsToMonitor.forEach(method { originalStringMethods[method] String.prototype[method]; String.prototype[method] function(...args) { console.time(String.${method}); const result originalStringMethods[method].apply(this, args); console.timeEnd(String.${method}); return result; }; }); return () { methodsToMonitor.forEach(method { String.prototype[method] originalStringMethods[method]; }); }; }7.3 跨浏览器兼容性问题不同浏览器对字符串方法的支持可能存在差异。// 兼容性处理工具函数 const StringUtils { // 安全的includes方法兼容旧浏览器 includes: function(str, searchValue, position) { if (String.prototype.includes) { return str.includes(searchValue, position); } return str.indexOf(searchValue, position) ! -1; }, // 安全的startsWith方法 startsWith: function(str, searchValue, position) { position position || 0; return str.lastIndexOf(searchValue, position) position; }, // 安全的endsWith方法 endsWith: function(str, searchValue, position) { if (position undefined || position str.length) { position str.length; } return str.indexOf(searchValue, position - searchValue.length) ! -1; } }; // 使用兼容性方法 const testStr Hello World; console.log(StringUtils.includes(testStr, World)); // 输出: true console.log(StringUtils.startsWith(testStr, Hello)); // 输出: true console.log(StringUtils.endsWith(testStr, World)); // 输出: true8. 高级技巧和最佳实践8.1 正则表达式与字符串操作正则表达式是字符串处理的强大工具。// 复杂的字符串处理示例 function advancedStringProcessing() { const text 联系我138-1234-5678 或者 139-8765-4321邮箱testexample.com; // 提取手机号 const phones text.match(/\d{3}-\d{4}-\d{4}/g); console.log(手机号:, phones); // 提取邮箱 const emails text.match(/\b[A-Za-z0-9._%-][A-Za-z0-9.-]\.[A-Z|a-z]{2,}\b/g); console.log(邮箱:, emails); // 字符串分词 const words text.split(/\s|[,.。;]/).filter(word word.length 0); console.log(词语:, words); } advancedStringProcessing(); // 模板字符串与正则表达式结合 function templateWithRegex(template, data) { return template.replace(/\$\{(\w)\}/g, (match, key) { return data[key] ! undefined ? data[key] : match; }); } const data { name: 张三, age: 25 }; const result templateWithRegex(姓名: ${name}, 年龄: ${age}, data); console.log(result); // 输出: 姓名: 张三, 年龄: 258.2 函数式编程风格使用函数式编程理念处理字符串操作。// 函数式字符串处理工具 const StringFP { // 管道操作 pipe: (...fns) (value) fns.reduce((acc, fn) fn(acc), value), // 字符串处理函数 trim: (str) str.trim(), toLower: (str) str.toLowerCase(), replace: (pattern, replacement) (str) str.replace(pattern, replacement), split: (separator) (str) str.split(separator), join: (separator) (arr) arr.join(separator) }; // 使用示例 const processString StringFP.pipe( StringFP.trim, StringFP.toLower, StringFP.replace(/\s/g, -), StringFP.split(-), StringFP.join(_) ); const input Hello World JavaScript ; console.log(processString(input)); // 输出: hello_world_javascript8.3 安全最佳实践字符串操作中的安全考虑。// XSS防护 function escapeHTML(str) { const div document.createElement(div); div.textContent str; return div.innerHTML; } // SQL注入防护Node.js环境 function escapeSQL(str) { return str.replace(//g, ) .replace(/\\/g, \\\\) .replace(/\0/g, \\0) .replace(/\n/g, \\n) .replace(/\r/g, \\r) .replace(/\x1a/g, \\Z); } // 输入验证 function validateInput(input, rules) { const errors []; if (rules.required !input.trim()) { errors.push(字段不能为空); } if (rules.minLength input.length rules.minLength) { errors.push(长度不能少于${rules.minLength}个字符); } if (rules.maxLength input.length rules.maxLength) { errors.push(长度不能超过${rules.maxLength}个字符); } if (rules.pattern !rules.pattern.test(input)) { errors.push(格式不正确); } return errors; } // 使用示例 const userInput scriptalert(xss)/script; console.log(escapeHTML(userInput)); // 输出转义后的安全文本 const sqlInput OReilly; console.log(escapeSQL(sqlInput)); // 输出: OReilly const validationResult validateInput(test123, { required: true, minLength: 5, maxLength: 20, pattern: /^[a-zA-Z0-9]$/ }); console.log(validationResult); // 输出: []通过系统学习JavaScript字符串的各个方面开发者可以写出更高效、更安全的代码。建议在实际项目中多练习这些技巧并根据具体需求选择合适的字符串处理方法。

相关新闻

基于遗传算法优化的RBF神经网络MIMO-OFDM信道估计

基于遗传算法优化的RBF神经网络MIMO-OFDM信道估计

1. 项目背景与核心价值在无线通信系统中,MIMO-OFDM技术因其高频谱效率和抗多径衰落能力成为5G及未来通信网络的核心技术。然而,信道估计作为系统接收端的关键环节,其精度直接影响着整体系统性能。传统最小二乘(LS)和线性最小均方误差(LMMSE)算…

2026/7/30 4:25:38阅读更多 →
uart_rx.h

uart_rx.h

/** ****************************************************************************** * file uart_rx.h * brief 串口中断接收、环形缓冲区和简单二进制帧接收。 * * 本文件是团队自己写的代码,放在 Core/Inc;uart_rx.c 放在 Core/Src。 * Cube…

2026/7/30 4:23:38阅读更多 →
放大器非线性失真研究装置:从原理到实践的硬件设计与算法实现

放大器非线性失真研究装置:从原理到实践的硬件设计与算法实现

1. 项目概述与核心价值放大器,这个在电子世界里无处不在的“能量搬运工”,我们总希望它是个完美的线性系统——输入一个正弦波,输出一个等比例放大的、纯净的正弦波。但现实很骨感,任何实际的放大器,无论是我们DIY的运…

2026/7/30 4:23:38阅读更多 →
Java集合框架与泛型应用深度解析

Java集合框架与泛型应用深度解析

1. Java学习日记——DAY22:深入理解集合框架与泛型应用 今天是我系统学习Java的第22天,决定把重点放在集合框架(Collection Framework)和泛型(Generics)这两个核心概念上。作为Java语言中最基础也最强大的特性之一,集合框架几乎出现在所有Jav…

2026/7/30 9:27:31阅读更多 →
2026年小程序开发:原生还是框架?

2026年小程序开发:原生还是框架?

一场效率与体验的博弈引言2026年,小程序已经从"轻量化替代方案"成长为很多企业数字化转型的标配。无论是电商零售、餐饮外卖、政务办事还是在线教育,几乎每一个高频场景都能看到小程序的身影。但当我们真正启动一个新项目时,摆在技…

2026/7/30 9:27:31阅读更多 →
Unity游戏实时翻译插件XUnity.AutoTranslator:原理、部署与优化指南

Unity游戏实时翻译插件XUnity.AutoTranslator:原理、部署与优化指南

1. 项目概述:为什么我们需要一个游戏翻译器? 如果你是一个喜欢玩独立游戏或者小众海外游戏的玩家,肯定遇到过这样的烦恼:游戏本身质量上乘,玩法独特,但偏偏没有中文支持。面对满屏的英文、日文或者其他语言…

2026/7/30 9:27:31阅读更多 →
软件测试面试必问:为什么要选择软件测试?

软件测试面试必问:为什么要选择软件测试?

经常会遇到一些面试官没事的时候问,为什么选择软件测试? 我都在这个行业,你怎么还问我为什么选择软件测试? 错误回答一:我觉得软件测试收入较高。 我们都知道软件测试收入是很高,但是这也不是你面试回答…

2026/7/30 9:27:31阅读更多 →
NutriBegin神经酸不是假洋牌,商标认证报关全记录可查

NutriBegin神经酸不是假洋牌,商标认证报关全记录可查

NutriBegin神经酸不是假洋牌,商标认证报关全记录可查 NutriBegin神经酸是不是假洋牌?要回答这个问题,不需要长篇大论,只需要把商标注册、生产资质、认证信息和进口记录这四份记录全部拿出来。每一项的信息如果都能公开查到&#x…

2026/7/30 9:27:31阅读更多 →
3个颠覆性功能:用SillyTavern打造沉浸式AI角色对话体验

3个颠覆性功能:用SillyTavern打造沉浸式AI角色对话体验

3个颠覆性功能:用SillyTavern打造沉浸式AI角色对话体验 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern是一个专为AI角色对话设计的强大前端界面,它让普…

2026/7/30 9:25:30阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →