JavaScript操作数组、字符串、对象的一些方法

vue常用方法(数组,对象,字符串,尔值,数值)汇总 在 Vue 开发中,我们经常会使用 JavaScript 内置的数组、对象、字符串、布尔值和数值方法。 阅读详情

注:纯手打,如有错误欢迎评论区交流!
转载请注明出处:https://blog.youkuaiyun.com/testleaf/article/details/148473785
编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除!
本文章将不定时更新,敬请期待!!!
欢迎点赞、收藏、转发、关注,多谢!!!

一、数组

1、查找元素

方法返回值是否修改原数组特点示例
find(callback)第一个匹配的元素❌适合复杂条件arr.find(x => x > 2) → 3
findIndex(callback)第一个匹配的索引❌找不到返回 -1arr.findIndex(x => x === 2) → 1
indexOf(value)值的第一个索引(严格匹配)❌简单值查找[1, 2, 2].indexOf(2) → 1
filter(callback)所有匹配的元素数组❌最常用arr.filter(x => x % 2 === 0) → [2, 4]
some(callback)true/false(至少一个匹配)❌快速验证arr.some(x => x < 0) → false
every(callback)true/false(全部匹配)❌严格检查arr.every(x => x > 0) → true

组合使用​​:

// 查找所有偶数的索引
const arr = [1, 2, 3, 4];
const evenIndices = arr
  .map((item, index) => ({ item, index }))
  .filter(({ item }) => item % 2 === 0)
  .map(({ index }) => index); // [1, 3]

2、增删/修改数组​

方法返回值是否修改原数组特点
push(...items)新长度✅尾部添加
pop()删除的末尾元素✅栈操作(后进先出)
unshift(...items)新长度✅头部添加(性能低)
shift()删除的头部元素✅队列操作(先进先出)
splice(start, deleteCount, ...items)被删除的数组✅万能增删改
concat(...arrays)合并后的新数组❌合并数组(或扩展运算符 ...)

组合使用​​:

// 删除第一个负数,并在其位置插入 0
const numbers = [1, -2, 3];
const negIndex = numbers.findIndex(x => x < 0);
if (negIndex !== -1) {
  numbers.splice(negIndex, 1, 0); // [1, 0, 3]
}

3、遍历/转换数组​

方法返回值是否修改原数组特点
map(callback)新数组(逐个转换)❌数据映射
forEach(callback)undefined❌单纯遍历(无法中断)
reduce(callback, initialValue)累计结果❌求和、分组等复杂操作
slice(start, end)浅拷贝的子数组❌截取部分(原数组不变)
join(separator)拼接的字符串❌默认逗号分隔

组合使用​​:

// 将对象数组转为键值对映射
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
const userMap = users.reduce((acc, user) => {
  acc[user.id] = user.name;
  return acc;
}, {}); // {1: 'Alice', 2: 'Bob'}

4、其他实用方法​

方法返回值是否修改原数组特点
length数组长度(可写)✅(修改长度)清空数组:arr.length = 0
at(index)指定位置的元素❌支持负数索引(arr.at(-1)),ES2022新增​
reverse()反转后的数组✅直接修改原数组
sort(callback)排序后的数组✅需自定义比较函数
// 获取数组最后三个元素的字符串
const arr = [1, 2, 3, 4, 5];
const lastThree = arr.slice(-3).join('|'); // "3|4|5"

5、总结对比表​

场景推荐方法避免场景
查找所有匹配项filter + map(组合索引和值)手动 for 循环
快速增删首尾元素push/pop/shift/unshift大量数据时用 splice
不可变数据转换map/filter/slice/concat直接修改原数组
复杂聚合操作reduce多层嵌套循环

终极组合示例​:

// 案例:从数组中提取所有大于2的偶数,并统计它们的总和
const arr = [1, 2, 3, 4, 5, 6];

const result = arr
  .filter(x => x > 2 && x % 2 === 0) // [4, 6]
  .reduce((sum, num) => sum + num, 0); // 10

// 或者一行解决:
const total = arr.reduce((sum, x) => (x > 2 && x % 2 === 0) ? sum + x : sum, 0);

二、字符串

1、查找和截取​

方法返回值是否修改原字符串特点示例
indexOf(searchStr)子串首次出现的索引❌区分大小写,未找到返回 -1'abc'.indexOf('b') → 1
lastIndexOf(searchStr)子串最后一次出现的索引❌从后向前搜索'abcb'.lastIndexOf('b') → 3
includes(searchStr)true/false❌检查是否包含子串'abc'.includes('bc') → true
startsWith(searchStr)true/false❌检查是否以子串开头'abc'.startsWith('ab') → true
endsWith(searchStr)true/false❌检查是否以子串结尾'abc'.endsWith('bc') → true
slice(start, end)截取的子串❌支持负数索引(类似数组)'abcde'.slice(1, 3) → 'bc'
substring(start, end)截取的子串❌负数视为 0,自动交换参数'abcde'.substring(2, 4) → 'cd'

组合使用​​:

// 提取文件名(不含扩展名)
const filename = 'file.txt';
const name = filename.slice(0, filename.lastIndexOf('.')); // 'file'

2、分割和拼接​

方法返回值是否修改原字符串特点
split(separator)分割后的数组❌按分隔符拆分字符串
concat(str1, str2)拼接后的新字符串❌等同于 + 运算符
repeat(count)重复拼接的新字符串❌重复指定次数

示例​​:

const str = 'a,b,c';
const arr = str.split(','); // ['a', 'b', 'c']
const newStr = arr.join('-'); // 'a-b-c'(数组方法)
const repeated = 'na'.repeat(2); // 'nana'

3、替换和大小写转换​

方法返回值是否修改原字符串特点
replace(searchStr, newStr)替换后的新字符串❌仅替换第一个匹配项
replaceAll(searchStr, newStr)替换所有匹配项❌需全局替换时使用
toLowerCase()全小写字符串❌不改变原字符串
toUpperCase()全大写字符串❌不改变原字符串
trim()去除两端空格的字符串❌包括 \t、\n 等空白字符
trimStart()去除头部空格的字符串❌ES2019 新增(别名:trimLeft)
trimEnd()去除尾部空格的字符串❌ES2019 新增(别名:trimRight)

示例​​:

const text = ' Hello World ';
const cleaned = text.trim().toLowerCase(); // 'hello world'
const replaced = text.replace('World', 'JS'); // ' Hello JS '

4、正则表达式相关​

方法返回值是否修改原字符串特点
match(regexp)匹配结果的数组或 null❌提取符合正则的子串
search(regexp)匹配到的索引或 -1❌类似 indexOf,支持正则
const email = 'test@example.com';
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); // true(验证邮箱格式)
const digits = 'a1b2c3'.match(/\d/g); // ['1', '2', '3']

5、其他实用方法​

方法返回值特点
at(index)指定位置的字符支持负数索引​​(ES2022新增)
charAt(index)指定位置的字符等同 str[index]
charCodeAt(index)字符的 Unicode 编码获取 ASCII 码
padStart(length, padStr)头部填充到指定长度常用于数字补零
padEnd(length, padStr)尾部填充到指定长度对齐文本

示例​​:

const num = '5';
const paddedNum = num.padStart(2, '0'); // '05'
const code = 'A'.charCodeAt(0); // 65

三、对象

1、属性操作​

方法/语法返回值特点示例
Object.keys(obj)所有可枚举属性的键数组不包含 Symbol 属性Object.keys({a:1}) → ['a']
Object.values(obj)所有可枚举属性的值数组ES2017 新增Object.values({a:1}) → [1]
Object.entries(obj)键值对数组([key, value])适合转为 MapObject.entries({a:1}) → [['a', 1]]
in 操作符true/false检查属性是否存在(包括原型链)'a' in {a:1} → true
obj.hasOwnProperty(key)true/false只检查自身属性{a:1}.hasOwnProperty('a') → true
Object.getOwnPropertyNames(obj)所有自身属性(包括不可枚举)不包含 SymbolObject.getOwnPropertyNames(obj)

示例​​:

const user = { name: 'Alice', age: 25 };

// 获取键、值、键值对
const keys = Object.keys(user); // ['name', 'age']
const values = Object.values(user); // ['Alice', 25]
const entries = Object.entries(user); // [['name', 'Alice'], ['age', 25]]

// 检查属性
console.log('age' in user); // true(包括继承属性)
console.log(user.hasOwnProperty('toString')); // false(不继承)

2、对象合并与复制​

方法/语法返回值特点
Object.assign(target, ...sources)合并后的对象浅拷贝,覆盖同名属性
扩展运算符 {...obj}新对象浅拷贝,适合不可变操作
JSON.parse(JSON.stringify(obj))深拷贝对象丢失函数/Symbol,性能低

示例​​:

const obj1 = { a: 1 };
const obj2 = { b: 2 };

// 合并对象
const merged = Object.assign({}, obj1, obj2); // { a:1, b:2 }
const mergedWithSpread = { ...obj1, ...obj2 }; // { a:1, b:2 }(推荐)

// 深拷贝(慎用)
const deepCopy = JSON.parse(JSON.stringify(obj1));

3、属性描述符与冻结​

方法返回值特点
Object.getOwnPropertyDescriptor(obj, key)属性描述符(可写/可枚举等)查看属性配置
Object.defineProperty(obj, key, descriptor)修改或定义属性精确控制属性行为
Object.freeze(obj)冻结对象不可修改/删除属性(完全不可变)
Object.seal(obj)密封对象不能增删属性(但可修改现有属性)

示例​​:

const obj = { name: 'Alice' };

// 冻结对象
Object.freeze(obj);
obj.name = 'Bob'; // 静默失败(严格模式报错)

// 密封对象
Object.seal(obj);
delete obj.name; // 失败(严格模式报错)
obj.name = 'Bob'; // 允许修改

4、原型操作​

方法返回值特点
Object.create(proto)以指定原型创建新对象替代 __proto__
Object.getPrototypeOf(obj)获取对象原型替代 obj.__proto__
Object.setPrototypeOf(obj, proto)设置对象原型性能差,慎用

​​示例​​:

const parent = { greet() { return 'Hello'; } };
const child = Object.create(parent); // 继承 parent

console.log(Object.getPrototypeOf(child) === parent); // true
console.log(child.greet()); // 'Hello'

5、其他实用方法​

方法返回值特点
Object.fromEntries(entries)将键值对数组转为对象反转 Object.entries
Object.is(value1, value2)严格比较两个值比 === 更精确(NaN/+0/-0)

示例​​:

// 键值对数组 → 对象
const entries = [['a', 1], ['b', 2]];
const obj = Object.fromEntries(entries); // { a:1, b:2 }

// 特殊比较
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(+0, -0)); // false

6、总结对比表​

场景推荐方法注意事项
遍历属性Object.keys()/Object.entries()不包含不可枚举/Symbol 属性
合并对象扩展运算符 {...obj}浅拷贝(嵌套对象仍共享引用)
深拷贝JSON.parse(JSON.stringify(obj))丢失函数/Symbol/undefined 等特殊值
防止修改Object.freeze()不可逆操作
原型操作Object.create()避免使用非标准的 __proto__

终极组合示例​:

// 案例:合并两个对象,过滤掉空值,并冻结结果
const defaults = { theme: 'light', fontSize: 16 };
const userSettings = { theme: 'dark', fontSize: null };

const cleanSettings = Object.entries(userSettings).reduce((acc, [key, value]) => {
  if (value !== null && value !== undefined) acc[key] = value;
  return acc;
}, { ...defaults });

Object.freeze(cleanSettings); // { theme: 'dark', fontSize: 16 }(不可修改)
js数组、对象、字符串常用方法 阅读详情

相关推荐

js处理字符串、数组、对象常用方法汇总

js常用方法汇总

weixin_61241731的博客 940

js七、常用方法(数组、对象、字符串、数值、日期对象)、递归、异常处理

数组方法(filter,findindex,indexof,every,some,reverse,concat,sort)对象方法(Object.keys /values /assign)字符串方法(split,substring,sartsWith,endsWith,includes,trim,转大小写,indexOf)日期对象,递归,异常处理,收藏夹(渲染,删除,添加,搜索)

CC__xy的博客 1104

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2423

JS易混淆的方法整理

js的字符串方法如substr、substring,数组方法如slice、splice等名字相近,用法稍有不同,让开发者在开发过程中总是记不起其用法,需要查资料。现整理一下,希望有助大家记忆。 String对象 slice stringObject.slice(start, end) var a = 'Hello world!'; var b = a.slice(2); var c = a...

weixin_34122548的博客 270

【理论&实战篇】大模型RAG技术详解(一)-基础篇

RAG的初衷是为了增强大模型的事实性、时效性,减少幻觉,引入专业知识优化生成回复,是一种结合了信息检索技术与语言生成模型的人工智能技术。通过,并将其作为提示(Prompt)输入给大模型(LLM),来。

qq_41375680的博客 373

FreeSwitch采用mrcp协议对接科大讯飞asr和tts以及对话系统

FreeSwitch采用mrcp协议对接科大讯飞asr和tts对接过程

shanghaimoon的专栏 8839

js 字符串操作函数

走进前端行业已有两年之久,对于字符串的操作也是家常便饭了,但也总在查查找找,如今对于我这个强迫症患者开始爆发了。 对字符串的操作做以下整理,废话不多说直接走起来。 1、字符串转换 字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: var num=24; var mystr=num.toString(); //...

450

踩过20+工控视觉项目的坑后,我用C# + 海康相机 + YOLOv11实现了零依赖产线缺陷检测

触发式检测:只有光电传感器检测到零件到位,才触发相机拍照和算法检测,不是持续推理,减少工控机性能占用;全链路本地运行:从图像采集、算法推理到不良品剔除,所有逻辑全在本地工控机运行,不需要外网、不需要云端服务,哪怕产线断网也能正常运行;异常降级机制:算法推理异常时,系统自动触发产线缓停,同时声光告警,不会让不良品流到下工序,满足汽车行业IATF16949质量要求;模块化解耦:算法核心层和业务逻辑层完全分离,后续更换YOLO模型、新增缺陷类型,只需要替换模型文件,不需要修改业务逻辑;全链路可追溯。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 152

js操作对象、字符串、数组的方法(一)

总结一下前端js操作对象、数组、字符串的一些方法(可能不全面后续遇见会补充): 一、遍历数组和对象 1、for循环 const arr = [1, 2, 3, 4, 5, 6]; for (let i = 0; i &lt; arr.length; i++) { console.log(arr[i]); // 打印出来的是 1 2 3 4 5 6 } ...

heyw的博客 933

【VS开发】【DSP开发】WinDriver简介(或介绍)

WinDriver for Windows简化并自动化了用户模式Windows设备驱动程序的开发,支持设备包括PCI / CardBus / ISA/ PCI-104 / PCMCIA * / PMC / PCI-X 和 CompactPCI,无需DDK或内核级编程知识。关于USB设备驱动开发,请参见WinDriver USB for Windows。   WinDriver包含一系列

ZhangPY的专栏 1474

Python之ae-toolbox包语法、参数和实际应用案例

ae-toolbox(全称 after-effects-toolbox)是 Python 生态中专门用于 Adobe After Effects(AE)自动化操作 的工具包,基于 AE 的 ExtendScript(JSX)桥接技术,实现 Python 与 AE 的跨语言通信。

王国平的博客 1173

JS:字符串、数组操作方法和算数对象(简)

前言:对于字符串、数组操作方法的掌握程度,在一定程度上反映着前端工程师的原生JavaScript水平。当然,也并不是说每一个方法都得熟练精通,对于初级阶段来说,重点应该先放在工作中常遇到的,使用频率高的,努力做到灵活运用,而要灵活运用也会结合一些算数对象的方法,所以就一起做个简要的总结。算数(Math)对象方法:方法: Math.random(); 生成0-1之间的随机数 Math.round(

TuboPe的博客 902

Autosar Dcm配置-App到Boot的跳转及1002回复配置及实现-基于ETAS软件

在软件刷写流程中,上位机(诊断仪)发送1002后,APP检查允许跳转boot后,在特定的ram(软复位不清除)写入指定置后通过触发软件复位来跳转到boot的。在APP跳转到Bootloader时,1002的回复有两种方式,一种是APP直接回复,然后跳转,另一种是APP回复NRC78,然后跳转,在Boot中回复。本文介绍这两种方式的实现。如果是在APP中回复,可以少发一个0x78,整体跳转时间可能会少一些。但是如果诊断在收到5002之后立马请求其他的服务,可能出现boot正在初始化而未正常接收到报文。

赞的博客 1554

JS常用的字符串,数组,对象及遍历操作方法整理

1

weixin_52092151的博客 674

YOLOv7独家原创改进:多种新颖的改进方式 | 保持原始信息-深度可分离卷积(MDSConv) | 全局感受野的空间金字塔 (Improve-SPPF)算法 | CA注意力改进版

多种新颖的改进方式 | 保持原始信息-深度可分离卷积(MDSConv) | 全局感受野的空间金字塔 (Improve-SPPF)算法 | CA注意力改进版

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1666

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

json对象、字符串-数组和数学对象中的相关方法、BOM对象、JS中的DOM操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录json对象字符串对象的相关方法获取字符串长度 length清除两侧的空白 trim [ python的strip ]获取首次出现的位置 indexOf [ python的find ]最后一次出现的位置 lastIndexOf连接字符串 concat截取字符串 slice截取字符串 substr拆分字符串 split [ python的 split ]大小写 toUpperCase ---- toLowerCasesear

m0_46471716的博客 279

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaScript学习二(js常用对象操作方法|window对象|Location对象|数组|字符串|)

WINDOW对象   Location对象 Screen对象   js对数组操作 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;数组函数&lt;/title&gt; &

踟蹰千年的博客 627

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

js数组,对象,字符串的常见方法

以下包括学习过程中搜集整理和个人总结的内容,有引用,侵删 数组常用方法 : length:设置或返回数组中元素的数目 push():向数组的末尾添加一个或多个元素,并返回新的长度,也就是添加元素后的数组长度 shift():用于把数组的第一个元素从其中删除,并返回第一个元素的值 unshift():向数组的开头添加一个或更多元素,并返回新的长度 pop():用于删除并返回数组的最后一个元素 splice():用于插入、删除或替换数组的元素 concat():方法用于连接两个或多个数组,该方法

weixin_40668206的博客 1019

js之作用域、预解析、对象、内置对象、简单类型和复杂类型

js之作用域 两种作用域 全局作用域:整个js标签或一个单独的js文件 局部作用域:只在函数内部起作用 变量的作用域:全局变量、局部变量 在函数内部没有声明直接赋值的变量也是全局变量 函数的形参也可以看作是局部变量(节约内存资源) js预解析 预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面 代码执行:从上往下,依次执行 1)变量提升:只提升变量声明,不提升赋值操作 2)函数提升:把所有的函数声明提升到函数的最前面,不调用函数 js对象 创建对象的三种方式: 1)字面量

qq_45169358的博客 162

JS对象(针对字符串和数组的操作方法)

一 #字符串的操作方法# 1 . concat操作方法 方法名: concat(str1,str2,str3…) 说明 : concat() 方法用于连接两个或多个字符串。拼接字符串,等效于+,+更常用 <script> var str1 = 'I'; var str2 = 'Love'; var str3 = 'You'; console.log(str1.concat(str2, str3, 'too'));

zheng的博客 228

js操作对象、字符串、数组的方法(二)

var str='abcd1235玩2432'; 1.charAt 返回指定索引出的字符 (不改变原来的字符串) var a=str.charAt(0); console.log(a); //'a' console.log(str); //'abcd' 2.charCodeAt 返回指定索引出的unicode字符 (获取unicode编码) str.charCodeAt(0);   /...

heyw的博客 281

javaScript对象的一些属性或方法

一·Array对象 数组对象有一些我们常用的属性或方法 1.属性 1.length:数组的长度,用来表示数组的个数 2.constructor:保存构造函数 2.方法 arr.push(元素) 1.往数组的末尾添加一个或多个元素 2.返回值是修改后的数组长度 3.会修改原数组 arr.unshift(元素) 1.往数组得开头添加一个或多个元素 2.返回值是修改后的数组长度 3.会修改原数组 arr.pop(元素) 1.从数组的末尾删除一个元素 2.返回值是被删除的元素 3.会修

Dreamy smile 384

java js对象转字符串数组_JSON 字符串 与 java,js 对象的转换

jsonLib 经典文章:http://json-lib.sourceforge.net/xref-test/net/sf/json/TestJSONObject.html// 引入相应的包//json-lib-2.2-jdk15.jarimport net.sf.json.JSONArray;import net.sf.json.JSONObject;1. //把java 对象列表转换为json...

weixin_36247910的博客 170

JavaScript06—数组,内建对象

数组,内建对象 数组 二维数组 arr[i][j]=5 对象数组 var arr=[{a:3,b:4},{a:5,b:6}] 内建对象 Math Math的属性 E 返回算术常量 e,即自然对数的底数(约等于2.718)。 LN2 返回 2 的自然对数(约等于0.693)。 LN10 返回 10 的自然对数(约等于2.302)。 LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)。 LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。 PI 返回圆周率(约等于3.

Iris_20的博客 207

JS 之对象基本概念

初学JS时总结的知识点。使用于小白。 JS对象的知识 1.JS中所有事物都是对象,对象含有属性和方法 var m = "hello world"; var x = m.length; //12 属性 var y = m.toUpperCase(); //HELLO WORLD 方法 2.创建对象 person = {firstname:"zhang", lastnam

XiaoDong的博客 397
上一篇: Linux压缩文件和移动文件
下一篇: 前端JavaScript力扣HOT100刷题【51-100】
testleaf
博客等级 码龄7年 3514粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

testleaf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值