新手必看:JavaScript中splice()和slice()的区别与使用场景(避坑指南)

【JavaScript】splice() 和 slice() 方法详解 splice()方法用于添加、删除或替换数组中的元素,并且会直接修改原数组。start(必填):指定要修改的起始索引。(可选):指定要删除的元素个数。(可选):要插入到数组中的新元素。slice()方法用于从原数组中提取部分元素,但不会修改原数组。start(必填):提取的起始索引。end(可选):提取的结束索引(不包含end位置的元素)。 阅读详情

JavaScript数组操作:彻底掌握splice()与slice()的实战应用

刚接触JavaScript数组操作时,我经常把splice()和slice()这两个方法搞混。它们的名字实在太像了,但功能却完全不同。记得有一次在项目中,我本想复制数组的一部分,却误用了splice(),结果导致原始数据被意外修改,调试了半天才发现问题所在。这种经历让我深刻认识到,理解这两个方法的本质区别对开发者来说有多重要。

本文将带你深入剖析splice()和slice()的核心差异,通过大量实际案例展示它们的正确用法,并分享一些我在项目中积累的经验教训。无论你是刚入门的新手还是有一定经验的开发者,都能从中获得实用的技巧,避免常见的陷阱。

1. 理解数组操作的基本概念

在深入探讨splice()和slice()之前,我们需要先明确几个JavaScript数组操作的核心概念。数组是JavaScript中最常用的数据结构之一,它提供了一系列内置方法来帮助我们高效地处理数据。

数组的可变性是一个关键特性。JavaScript中的数组分为可变方法和不可变方法:

  • 可变方法:会直接修改原始数组
  • 不可变方法:返回新数组或值,不影响原数组

理解这一点至关重要,因为它直接关系到我们代码的可靠性和可预测性。在实际开发中,意外修改原始数据往往是难以追踪的bug来源。

另一个重要概念是方法的返回值。有些数组方法会返回修改后的数组,有些则返回被删除的元素,还有些返回新数组。了解每个方法的返回值能帮助我们更好地组织代码逻辑。

2. splice()方法深度解析

splice()是JavaScript数组中最强大的修改方法之一,它可以实现删除、插入和替换三种操作。但正是这种多功能性,也让它成为新手最容易用错的方法。

2.1 基本语法与参数

splice()的基本语法如下:

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

参数解析:

  • start:必需,指定修改的起始位置
  • deleteCount:可选,要删除的元素个数
  • item1, item2,...:可选,要添加进数组的元素

关键点:splice()会直接修改原数组,并返回被删除的元素组成的数组。如果没有删除任何元素,则返回空数组。

2.2 三种主要操作模式

删除元素
let fruits = ['苹果', '香蕉', '橙子', '芒果'];
let removed = fruits.splice(1, 2);

console.log(fruits); // ['苹果', '芒果']
console.log(removed); // ['香蕉', '橙子']

这个例子展示了如何从索引1开始删除2个元素。注意原数组被修改了,而removed变量接收了被删除的元素。

插入元素
let colors = ['红', '绿', '蓝'];
colors.splice(1, 0, '黄', '紫');

console.log(colors); // ['红', '黄', '紫', '绿', '蓝']

这里我们将deleteCount设为0,表示不删除任何元素,只在指定位置插入新元素。这是一个非常有用的技巧,特别是在需要保持数组长度不变的情况下添加数据。

替换元素
let numbers = [1, 2, 3, 4, 5];
numbers.splice(2, 2, 'a', 'b', 'c');

console.log(numbers); // [1, 2, 'a', 'b', 'c', 5]

这个例子展示了如何用新元素替换原有元素。我们删除了索引2开始的2个元素,并在同一位置插入了3个新元素。注意替换不要求元素数量相同。

2.3 实际应用场景与技巧

场景一:批量删除满足条件的元素

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (let i = data.length - 1; i >= 0; i--) {
  if (data[i] % 2 === 0) {
    data.splice(i, 1);
  }
}
console.log(data); // [1, 3, 5, 7, 9]

提示:从后向前遍历数组进行删除操作可以避免索引错位的问题。

场景二:在特定位置插入多个元素

let todoList = ['起床', '吃早餐', '工作'];
let newItems = ['晨跑', '洗澡'];
todoList.splice(1, 0, ...newItems);

console.log(todoList); 
// ['起床', '晨跑', '洗澡', '吃早餐', '工作']

场景三:实现数组的快速清空

let tempData = [/* 大量数据 */];
tempData.splice(0);
// 比tempData = []更高效,特别是大数据量时

3. slice()方法全面掌握

与splice()不同,slice()是一个纯函数式的数组方法,它不会修改原数组,而是返回一个新的数组。这种特性使得slice()在函数式编程中特别受欢迎。

3.1 基本语法与参数

slice()的语法非常简单:

array.slice([start[, end]])

参数说明:

  • start:可选,提取起始索引(包含)
  • end:可选,提取结束索引(不包含)

重要特性:

  • 不修改原数组
  • 返回新数组(浅拷贝)
  • 支持负数索引(表示从末尾开始计算)

3.2 多种使用方式

基本截取
let letters = ['a', 'b', 'c', 'd', 'e'];
let part = letters.slice(1, 4);

console.log(part); // ['b', 'c', 'd']
console.log(letters); // ['a', 'b', 'c', 'd', 'e'] (未改变)
使用负数索引
let numbers = [1, 2, 3, 4, 5];
let lastTwo = numbers.slice(-2);
let middle = numbers.slice(1, -1);

console.log(lastTwo); // [4, 5]
console.log(middle); // [2, 3, 4]
数组浅拷贝
let original = [{id: 1}, {id: 2}];
let copy = original.slice();

console.log(copy); // [{id: 1}, {id: 2}]
console.log(original === copy); // false
console.log(original[0] === copy[0]); // true (浅拷贝)

注意:slice()创建的是浅拷贝,对于包含对象的数组,对象本身是共享的。

3.3 实际应用场景

场景一:分页处理

function getPage(items, page, pageSize) {
  const start = (page - 1) * pageSize;
  return items.slice(start, start + pageSize);
}

const allItems = [/* 大量数据 */];
const page3 = getPage(allItems, 3, 10);

场景二:获取URL参数

function getQueryParams() {
  return window.location.search
    .slice(1)
    .split('&')
    .map(param => param.split('='));
}

场景三:处理DOM节点集合

const paragraphs = document.querySelectorAll('p');
const firstThree = Array.prototype.slice.call(paragraphs, 0, 3);

4. splice()与slice()的对比与选择

虽然这两个方法名字相似,但它们的用途和特性有本质区别。理解这些差异能帮助我们在正确场景选择正确的方法。

4.1 核心差异对比

特性splice()slice()
修改原数组✅ 是❌ 否
返回值被删除的元素数组提取的新数组
主要用途增删改数组元素提取数组部分
性能影响可能触发数组重新索引无影响
函数纯度非纯函数(有副作用)纯函数(无副作用)

4.2 何时使用哪个方法

使用splice()当:

  • 需要直接修改原数组
  • 要实现删除、插入或替换操作
  • 不关心原数组是否保持不变

使用slice()当:

  • 需要获取数组的一部分而不修改原数组
  • 需要创建数组的浅拷贝
  • 在函数式编程中需要无副作用的操作

4.3 常见误区与解决方案

误区一:混淆方法导致数据意外修改

// 错误示例
const original = [1, 2, 3, 4];
const part = original.splice(1, 2); // 意外修改了原数组

// 正确做法
const original = [1, 2, 3, 4];
const part = original.slice(1, 3); // 保持原数组不变

误区二:忽略splice()的返回值

// 低效做法
const arr = [1, 2, 3, 4];
const removed = [];
removed.push(arr.splice(1, 1)[0]);
removed.push(arr.splice(1, 1)[0]);

// 更佳做法
const arr = [1, 2, 3, 4];
const removed = arr.splice(1, 2); // 一次性获取所有被删除元素

误区三:对大数组使用slice()的性能问题

虽然slice()不会修改原数组,但对于非常大的数组,频繁使用slice()可能会带来内存压力。在这种情况下,考虑使用迭代器或其他处理方式可能更高效。

5. 高级技巧与实战案例

掌握了基础知识后,让我们来看一些更高级的使用技巧和实际项目中的应用案例。

5.1 结合使用slice()和splice()

这两个方法虽然功能不同,但结合使用可以解决一些复杂问题。

案例:在数组中间插入另一个数组

function insertArrayAt(target, index, arrayToInsert) {
  const after = target.slice(index);
  target.splice(index, target.length - index, ...arrayToInsert, ...after);
  return target;
}

const main = [1, 2, 5, 6];
const toInsert = [3, 4];
insertArrayAt(main, 2, toInsert);
console.log(main); // [1, 2, 3, 4, 5, 6]

5.2 实现不可变数组操作

在现代前端框架如React中,不可变数据模式非常重要。我们可以利用slice()来实现这种模式。

// 不可变的删除
function immutableRemove(arr, index) {
  return [...arr.slice(0, index), ...arr.slice(index + 1)];
}

// 不可变的插入
function immutableInsert(arr, index, ...items) {
  return [...arr.slice(0, index), ...items, ...arr.slice(index)];
}

5.3 性能优化技巧

批量操作优于多次调用

// 低效
arr.splice(5, 1);
arr.splice(10, 1);
arr.splice(15, 1);

// 高效
const indicesToRemove = [5, 10, 15].sort((a, b) => b - a);
indicesToRemove.forEach(i => arr.splice(i, 1));

使用slice()替代循环复制

// 不必要的手动复制
const newArr = [];
for (let i = 0; i < arr.length; i++) {
  newArr.push(arr[i]);
}

// 更简洁的方式
const newArr = arr.slice();

5.4 实际项目经验分享

在最近的一个数据可视化项目中,我需要处理大量的时间序列数据。原始数据包含数十万个点,但前端只需要显示最近500个点。使用slice()可以高效地获取所需数据段:

function getLatestDataPoints(fullData, count) {
  return fullData.slice(-count);
}

另一个常见场景是在实现撤销/重做功能时,我们需要保存应用状态的历史记录。这时结合slice()和splice()可以很好地管理历史堆栈:

class History {
  constructor() {
    this.stack = [];
    this.currentIndex = -1;
  }
  
  push(state) {
    // 移除当前索引之后的所有状态
    this.stack.splice(this.currentIndex + 1);
    this.stack.push(JSON.parse(JSON.stringify(state)));
    this.currentIndex = this.stack.length - 1;
  }
  
  undo() {
    if (this.currentIndex > 0) {
      this.currentIndex--;
      return JSON.parse(JSON.stringify(this.stack[this.currentIndex]));
    }
    return null;
  }
  
  redo() {
    if (this.currentIndex < this.stack.length - 1) {
      this.currentIndex++;
      return JSON.parse(JSON.stringify(this.stack[this.currentIndex]));
    }
    return null;
  }
}
别再混淆了!JS中slice()、splice()和split()的区别与使用场景全解析 本文详细解析了JavaScript中slice()、splice()和split()三个方法的区别与使用场景。通过语法解析、核心对比和实战案例,帮助开发者准确理解slice()的安全提取、splice()的数组修改和split()的字符串分割功能,避免常见混淆和错误用法。 阅读详情

相关推荐

SpringBoot与锐浪报表服务器深度整合实战指南

本文详细介绍了SpringBoot与锐浪报表服务器的深度整合实战指南,包括环境准备、Windows/Linux系统配置、核心功能实现代码解析及常见问题解决方案。通过具体案例和代码示例,帮助开发者高效完成报表系统的集成与部署,提升企业级应用的报表处理能力。

weixin_29238147的博客 370

splice和slice的区别

1.splice改变原数组,slice不改变原数组。2.splice除了可以删除之外,还可以插入。3.splice可传入3个参数,slice接受2个参数。

yunanxxx的博客 3780

光电容积脉搏波PPG信号分析笔记

脉搏波信号PPG分析笔记

teresa_zp的专栏 6477

splice()和slice()区别

很多新手对于splice()和slice()两个方法容易混淆,其实这两个方法单看名字很像,当用法其实差别很大,且最重要的区别是splice()会改变原数组,返回的是改变的内容;slice()不会改变原数组,会返回一个新的数组。下面是他们的详细区别 一、splice() 定义:从数组中添加或删除元素,然后返回被删除的数组元素 语法:arrayObject.splice(index,n,item1,.....,itemN) 1、index表示从什么位置开始添加或删除数组元素 2、n表示删除的元素数

weixin_42978193的博客 3661

Linux音频处理实战:从MP3解码到ALSA播放的完整流程解析

本文详细解析了Linux环境下从MP3文件解码到通过ALSA播放音频的完整实战流程。文章深入剖析了MP3文件结构、PCM原始音频数据格式,并提供了使用ffmpeg/mpg123解码、以及利用ALSA库进行C语言编程播放的实用代码示例,帮助开发者彻底掌握Linux音频处理的核心链路。

weixin_29206669的博客 72

4.1 AI Agent对比分析:Coze、Dify、LangGraph,如何选择Agent框架

本文对比分析了三大主流AI Agent框架:Coze(字节跳动平台,可视化开发,适合快速企业应用)、Dify(开源企业级方案,支持定制部署)和LangGraph(代码开发灵活,适合复杂需求)。选择指南建议:需要快速开发选Coze,需开源定制选Dify,复杂灵活需求选LangGraph。核心要点包括理解各框架特点、根据需求评估选择,并提供了实践建议。下节将介绍Coze平台的实战应用。

yonggeit的博客 3145

JS 数组操作的利器:splice() 和 slice() 方法详解

JavaScript中的数组操作是编程中常见的任务之一。splice()和slice()方法是两个非常有用的数组方法,可以帮助我们在数组中插入、删除、替换元素,以及提取子数组。在本篇博客中,我们将深入探讨splice()和slice()方法的用法,并提供一些实用的代码示例。

TianXuab的博客 5890

流体仿真软件:COMSOL Multiphysics二次开发_(3).流体仿真基础理论

流体仿真基础理论包括流体的基本性质、流体运动方程、边界条件、初始条件、湍流模型和网格生成等。在使用COMSOL Multiphysics进行流体仿真时,正确设置这些参数和条件是获得准确仿真结果的关键。通过实际应用案例,可以更好地理解如何在COMSOL中进行流体仿真,并提取和分析仿真结果。希望本文对流体仿真初学者和从业人员有所帮助。

kkchenjj的博客 1341

Vue进阶(五十九):splice() 与 slice() 详解

ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。 arr.splice(arr.findIndex(item => item.id === data.id), 1) 1. js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组。 splice有3个参数,它也可以用来替换......

IT全栈 华强工作室 3万+

在YOLO中扩充新类别并且不影响旧类的识别精度

让我们先从简单的部分开始:用我们的新类训练自定义 YOLOv8 模型。在本教程中,我们将向模型添加车牌类。我们将使用Roboflow 中的一个数据集。这个数据集有两个车牌类。在开始训练之前,我们还必须对库进行一些更改。为了节省时间,我还将本教程中我们将进行的更改转换为补丁该补丁包含多项更改,但大多数更改都用于指南的下一部分。if RANK!= -1:是的,我们将编写一个回调。我们希望将此自定义训练模型的头部与 COCO 预训练模型中的旧头部一起使用。

如果想成为中心,那么就到中心去吧。 1225

PyTorch实战(14)——图注意力网络(Graph Attention Network,GAT)

本节介绍了图注意力网络 (Graph Attention Network, GAT) 在节点分类任务中的应用。相比图卷积网络 (GCN) 的平均聚合机制,GAT 通过引入注意力机制,能够为不同邻居节点分配差异化权重,从而更精准地捕捉图结构信息。实验表明,GAT 在 CiteSeer 数据集上的分类准确率达到 71.1%,较 GCN 提升 2.5 个百分点。可视化结果显示,GAT 学习到的节点表征具有更好的类别区分度。这验证了注意力机制在图数据建模中的有效性,为处理复杂图结构任务提供了更优解决方案。

盼小辉丶的博客 3555

slice和splice有什么区别

例如,在状态管理中谨慎使用这些方法,可以减少不必要的渲染次数,进而提升用户体验。此外,了解这些基本方法的工作原理有助于更深入地掌握JavaScript的核心概念,为解决更复杂的问题奠定坚实基础。方法用于返回一个新的数组对象,这个数组包含从start到end(不包括end)的原数组中的元素。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,,为我们广大开发同胞谋福祉,

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1012

纯C语言实现的Luhn算法(信用卡校验位):详解与示例

在本文中,我们详细介绍了如何使用纯C语言实现Luhn算法,并提供了一些示例代码。用于检查任意长度的数字字符串的有效性,用于计算给定数字字符串的校验位字符。我们还提供了一个简单的“main”C程序,用于在命令行上接受一个或多个数字字符串,并计算它们的校验位字符。通过阅读本文和理解示例代码,我们希望读者能够更好地理解Luhn算法的工作原理,并能够在自己的项目中应用这种算法。

qq_38334677的博客 1221

javaScript中slice()和splice()的用法与区别

【代码】javaScript中slice()和splice()的用法与区别。

JLY19970726的博客 635

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaScript slice() 和 splice()

slice slice:指定在一个数组中的元素创建一个新的数组,原数组不会变。 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) let arr1 = new Array(1,2,3,4,5,6,7,8,9); let arr2 = arr1.slice(4,7); console.log(arr1);    console.log(arr2); 运行结果: splice splice(index,count) 参数: inde

且听风吟的博客 1639

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JS中的splice()和slice()方法

Array.prototype.splice() splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。 语法

weixin_45680024的博客 945

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JS数组slice()和splice()的用法和区别

JS数组slice()和splice()的区别 slice() var a=["a","b","c","d","e"]; console.log(a.slice(1,3)); //结果:"b" ,"c" //表示从1开始,截止到第三个,包含第三个,不包括第一 console.log(a); //结果:"a","b","c","d","e" console.log(a.slice(-1)); //结果:"e" // 如果start是负数,则会从数组

weixin_51109349的博客 885

JS中从Array.slice()与Array.splice()的底层实现原理分析区别

1.Array.prototype.slice() slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对像,原始数组不会改变。arrayObject.slice(start,end) start (可选,如果start不写则从0开始)从该索引处开始提取原数组中的元素。 如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2)表示提取原

coder_chenz的博客 9797

JS中slice和splice的区别

# slice() **1、String中** - 语法     `string.slice(start, end)` 抽取一个子字符串 - 描述     `slice()`将返回一个含有字符串`string`的片段的字符串或返回它的一个子串。 但是该方法不修改`string` - 参数     `start:`要抽取的片段的起始下标。如果是负数,那么该参数声明了从字符串的尾部开始算

关注最新技术问题并持续维护更新 1344

JavaScript中split、slice和splice的区别

JavaScript中split、slice和splice的区别

weixin_44784401的博客 1263

substring、substr、slice、splice的用法和区别。

那么就由一道笔试题引入吧,已知有字符串a=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”; var a = "get-element-by-id"; function change(obj){   //先将字符串按照“-”进行切割为数组   var arr = obj.split("-");   for(var i=1;i<arr.length;i++){     //由于get不需要转大写,所以从下标1开始,对第一位字母转.

高先生的猫 1858

JS数组slice和splice方法比较

作为一个前端初学者,学习过程中发现好多相近的细节总是记混,每次都要查一下来确认,麻烦又费时间。于是稍微花了点时间总结了一下,也希望可以帮助大家记忆。 数组的slice()和splice()操作 二者都是对数组进行截取的操作,那么它们有什么异同呢? 1、slice()最重要的一点:它不改变原数组,返回的是截取后的新数组!参数可以传1或2个,参数也可以为负数,具体的几种情况如下: (1)传入一个参数:arr.slice(num1),参数num1可以为正数或者负数。 正数表示:从索引为num1的位置截取

BeaconLin的博客 918

JavaScript中数组splice()和slice()的区别

目录先说结论:splice:参数说明:举例说明:slice:参数说明:举例说明: 先说结论: splice:改变原来的数组本身 slice:开辟新空间存储新数组 splice: 参数说明: splice(beginIndex, deleteLength, …args); beginIndex: 表示的是从数组的beginIndex下标开始删除。 deleteLength:表示的是删除deleteLength长度的元素。 …args: 表示的是要在此插入的元素。 举例说明: let arr=["啊","吧",

王跃坤的博客 1364

JavaScript第 19 篇,JavaScript中splice()、slice()、split()三种方法的区别,及使用详细

⭐在JavaScript中,splice(), slice(), 和 split() 是三个非常常用的方法,它们分别用于数组和字符串的不同操作。表面看起来有点相似,用处却大不相同,今天就来分享一下他们的用法,简单记录一下

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 4441

深入解析 JavaScript 中的 slice() 和 splice() 方法

是 JavaScript 中两个常用的数组方法,但它们的功能和用法截然不同。本文将详细分析它们的区别、用法、应用场景,并提供丰富的示例。,可以有效地操作数组数据,提升代码的灵活性和可维护性。,并返回一个新的数组,以下示例展示如何使用。

一萧烟雨任平生 2352

javascript slice()和splice()函数的区别及用法

javascript slice()和splice()函数的区别及用法 1.splice() splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。 (1)语法 arrayObject.splice(index,howmany,item1,…,itemX) index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 item1, …, itemX 可选。向数组添加的新项目。 返回值 :Arr

qq_40891322的博客 267
上一篇: FreeModbus移植避坑指南:STM32F103+FreeRTOS环境下的寄存器操作全解析
下一篇: 点云分割避坑指南:传统区域生长 vs 深度学习方法的5个关键差异
github5actions
博客等级 码龄1天 0粉丝 1824原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值