JavaScript -深拷贝函数封装

JavaScript - 浅拷贝 / 深拷贝(函数封装) 前言 如果你只想知道如何实现深浅拷贝,请直接跳过 前言 ,移步代码部分。 今天开发小程序,需求是 实现一个长按管理应用的功能(似支付宝应用管理功能) ,当我做到了用户可以添加或移除应用时,发现直接操作改变了原数组(即应用列表数据),导致取消功能无法完成(因为需要对比原数组,但已经被改变了)。 解决办法就是将初始数组进行拷贝,让用户操作副本。这样取消按钮的恢复与保存功能就能实现。 浅拷贝 仅仅复制对象的引用,而不是对象本身。 浅拷贝的实现方法比较简单,下面介绍 2 个,都可以直接使用。 一、简单复制 阅读详情

深拷贝与浅拷贝区别
浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存; 改变一个对象,另一个会随之改变;
深拷贝:复制并创建一个一模一样的对象,不共享内存,修改新对象,旧对象保持不变。

浅拷贝实现

var arr = [1, 2, 3, 4];

var arr2 = arr;
arr2[0] = "okokok"; 
console.log(arr); // ["okokok", 2, 3, 4]
console.log(arr2); // ["okokok", 2, 3, 4] 

像这样简单的赋值便是浅拷贝,一个对象改变,另一个也随之改变。

如何实现深拷贝 下面封装一个方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
         //数据
        var obj={
            a:1,
            b:"aaa",
            c:false,
            d:{
                e:[3,4,6,8,9],
                f:null,
                g:[
                    {id:1,name:"abc",price:100,tag:["自营","特价"]},
                    {id:2,name:"def",price:200,tag:["自营"]},
                    {id:3,name:"ghi",price:300,tag:["自营","特价","双十一"]},
                    {id:4,name:"gkl",price:400,tag:["专柜","双十一"]}
                ],
                h:{
                    i:/^(?=\D+\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/i,
                    j:new Date(),
                    k:{

                    }
                }
            }
        }
        Object.defineProperties(obj.d.h.k,{
            l:{
                value:[
                [1,2,3,4],
                [1,4,3,4],
                [1,6,3,4],
                ]
            },
            m:{
                enumerable:true,
                value:document.createElement("div")
            },
            n:{
                writable:true,
                value:{
                    o:[1,2,3],
                }
            }
        })
        
        //封装方法
        function cloneObj(source,target){
            // 如果目标对象不存在,根据源对象的类型创建一个目标对象
            if(!target) target=new source.constructor();
            // 获取源对象的所有属性名,包括可枚举和不可枚举
            var names=Object.getOwnPropertyNames(source);
            // 遍历所有属性名
            for(var i=0;i<names.length;i++){
                // 根据属性名获取对象该属性的描述对象,描述对象中有configurable,enumerable,writable,value
                var desc=Object.getOwnPropertyDescriptor(source,names[i]);
                // 表述对象的value就是这个属性的值
                // 判断属性值是否不是对象类型或者是null类型
                if(typeof desc.value!=="object" || desc.value===null){
                    // 定义目标对象的属性名是names[i],值是上面获取该属性名的描述对象
                    // 这样可以将原属性的特征也复制了,比如原属性是不可枚举,不可修改,这里都会定义一样
                    Object.defineProperty(target,names[i],desc);
                }else{
                    // 新建一个t对象
                    var t={};
                    // desc.value 就是源对象该属性的值
                    // 判断这个值是什么类型,根据类型创建新对象
                    switch(desc.value.constructor){
                        // 如果这个类型是数组,创建一个空数组
                        case Array:
                            t=[];
                        break;
                        // 如果这个类型是正则表达式,则将原值中正则表达式的source和flags设置进来
                        // 这两个属性分别对应正则desc.value.source 正则内容,desc.value.flags对应修饰符
                        case RegExp:
                            t=new RegExp(desc.value.source,desc.value.flags);
                        break;
                        // 如果是日期类型,创建日期类型,并且把日期值设置相同
                        case Date:
                            t=new Date(desc.value);
                        break;
                        default:
                        // 如果这个值是属于HTML标签,根据这个值的nodeName创建该元素
                            if(desc.value instanceof HTMLElement)
                                t=document.createElement(desc.value.nodeName);
                        break;
                    }
                    // 将目标元素,设置属性名是names[i],设置value是当前创建的这个对象
                    Object.defineProperty(target,names[i],{
                        enumerable:desc.enumerable,
                        writable:desc.writable,
                        configurable:desc.configurable,
                        value:t
                    });
                    // 递归调用该方法将当前对象的值作为源对象,将刚才创建的t作为目标对象
                    cloneObj(desc.value,t);
                }
            }
            return target;
        } 
       var o=cloneObj(obj);
       o.d.f="深拷贝"
       o.d.h.k.n.o[0]='深拷贝'
       console.log(obj);
       console.log(o); 
       
    </script>
</body>
</html>

在这里插入图片描述

基于MATLAB的井筒多相流模拟 井筒多相流的模拟可以基于不同的数学模型和计算方法。其中,最常用的模型之一是多相流模型,它基于质量守恒、动量守恒和能量守恒等原理,描述了流体在井筒中的流动行为。对于井筒多相流的模拟和分析可以帮助我们理解和优化油气田开发过程中的流体行为,从而提高产量和效率。在本文中,我们将介绍如何使用MATLAB进行井筒多相流的模拟,并提供相应的源代码。需要注意的是,以上示例是一个简化的模拟,仅用于演示如何使用MATLAB进行井筒多相流模拟。实际应用中,我们需要考虑更多的物理过程和参数,并使用更复杂的数值方法和模型进行模拟。 阅读详情

相关推荐

科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化

本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。

weixin_42524708的博客 1131

封装深拷贝函数

深拷贝函数 function isObject(value) { const valueType = typeof value return (value !== null) && (valueType === "object" || valueType === "function") } function deepClone(originValue) { // 判断是否是一个Set类型 if (originValue instanceof Set) { retur

weixin_42492399的博客 446

Fedora 41上安装钉钉7.6.25,我踩过的那些依赖坑和最终解决方案

本文详细记录了在Fedora 41上安装钉钉7.6.25版本的全过程,包括解决依赖问题、转换deb包为rpm格式、处理libm.so.6错误等关键步骤。通过分享这些实用技巧和最终解决方案,帮助Linux用户顺利在Fedora系统上运行钉钉客户端,提升工作效率。

weixin_30485379的博客 205

JavaScript手动封装一个深拷贝函数(递归实现)

浅拷贝: 简单的赋值拷贝操作,产生重复释放问题 深拷贝: 在堆区重新申请空间,进行拷贝操作,防止重复释放问题 <script> const people = { name: '一只不太聪明的燕子', age: 18, address: { city: 'Nanjing' }, hobby: ["吃饭", "睡觉", "写bug", { play: ["排球", "羽毛球"] }] .

weixin_42678796的博客 869

SAP-MM-PR分配货源并转PO

SAP-MM-PR分配货源并转PO

yanzibing99的博客 5473

将pytroch模型转为paddlelite模型并集成到android程序中

在android中使用paddlelite加载yolov5模型识别opencv读取的摄像头信息

qq_56460466的博客 1555

2021-07-06 封装深拷贝以及一些实用的函数

以下函数封装参照jQuery源码 首先,将一些原生函数用自己的变量定义 let getProto = Object.getPrototypeOf, // 获取Object.getPrototypeOf方法 class2type = {}, //创建一个空对象 toString = class2type.toString, //获取Object.prototype.toString方法 hasOwn = class2type.hasOwnPrototype,//获取Object.hasOwnProto

qq_44014425的博客 206

Web3:Ubuntu系统 使用Docker-compose方式部署blockscout浏览器&配置版本-v5.2.3-beta+charts图表

详细介绍了在Ubuntu 23.04系统上部署Blockscout浏览器的步骤,以及过程中遇到的问题进行一一解决。

鄙人kunzhi96,感恩遇见! 2万+

深拷贝的三种实现方法

深拷贝拷贝多层,每一级别都拷贝,修改拷贝后的对象,原对象不改变,如果对象里有函数, undefind, data对象。// 封装函数 利用递归遍历每一项。3.使用 lodash插件。

mt213217的博客 3889

为 ABAP BSP 与 ICF 量身打造的错误页实践:从 CX_ROOT 到 SICF 的端到端落地指南

摘要 本文系统讲解SAP ABAP平台中BSP与ICF层的错误页定制方法。在BSP层,通过标记错误页属性和绑定ERROR_OBJECT异常对象,实现友好的错误展示与日志记录。ICF层通过SICF事务码统一配置错误页、登录与登出逻辑,支持服务树继承。文章包含可直接落地的代码示例,并针对现代Fiori架构给出演进建议,帮助开发者提升用户体验与系统安全性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

javascript深拷贝函数封装

javascript深拷贝函数封装

m0_63986895的博客 494

地图之家总目录

地图之家总目录 cesium示例 leaflet示例

GIS之家家长 1万+

JS封装深拷贝函数

Object.assign只能深拷贝第一层的数据,如果有多层数据就会出现浅拷贝的情况 // 处理深拷贝问题 一个对象里面可能会出现多种情况, let a = { a:1, b:[1,2,3,{a:1},[1,2]], c:{c1:1,c2:2,c3:{cc1:1}}, d:function(){ console.log(1) }, ...

halations的博客 478

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

js判断数据类型以及深拷贝的函数封装

记录js 判断数据类型和深拷贝函数的封装。

锦瑟年华L的博客 226

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JS-封装深拷贝函数

简单实现一个深拷贝的函数 实现 function deepClone(origin){ var isObject = any => typeof any == 'object' && any != null var isArray = any => Object.prototype.toString.call(any) === '[object ...

陈同学的博客 1773

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何使用js函数封装一个深拷贝?

【代码】如何使用js函数封装一个深拷贝?

zhaojiaxing123的博客 182

js数组或者对象深拷贝和浅拷贝函数封装

浅拷贝 概念:浅拷贝的意思就是只复制引用,而未复制真正的值。仍指向同一个地址,修改时原对象也会受到影响 方法: 1.利用 = 赋值操作符实现浅拷贝。 2.数组的浅拷贝一般使用 slice、concat。 3.数组浅拷贝 - 遍历 。 4.对象浅拷贝 - Object.assign()。 5.对象浅拷贝 - 扩展运算符 函数封装 //对象及数组浅拷贝函数封装 functi...

CloudEmperor 1175

JS——深拷贝的封装函数

function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){ if(key in obj){ if(obj.hasOwnProperty(key)){ //判断obj子元素是否为对象,如果是,递.

Sunshine0508的博客 212

js深拷贝封装函数

function deepClone(object) { let str let newobj = object.constructor === Array ? [] : {} if (typeof object !== 'object') { return object } else if (window.JSON) { str = JSON.stringify(object) newobj = JSON.parse(str) } else { for.

weixin_52361730的博客 297

js深拷贝函数封装

function deepClone(object) { let str let newobj = object.constructor === Array ? [] : {} if (typeof object !== 'object') { return object } else if (window.JSON) { str = JSON.stringify(object) newobj = JSON.parse(str) } else { for.

weixin_47545264的博客 208

Javascript封装深拷贝

Javascript封装深拷贝

qq_43151592的博客 272

js对象深复制/深拷贝功能函数封装

js对象深复制封装(深拷贝) 深复制,及源对象的属性如果有对象,该对象属性修改后,不会引起复制后的对象各属性的改变, 源对象的任何属性及子属性与新对象的直接没有任何引用关系。 一下例举几种浅复制常见方法: for(var prop in obj){ // 浅复制 } Object.assign();//浅复制 var obj1={...obj};//浅复制 如果原obj1就存在,还会改变原obj1的引用地址

RequesToGod的博客 379

js常见面试题,深拷贝的函数封装

function mycopy(_data){ // 判断是否为基本数据类型或者是否为空值,如果是则返回数据值 if(typeof _data !== "object" || _data == null){ return _data; } let data; // 如果不是基本数据类型,则判断传入的是数组还是对象,并赋值给返回值data if(_data instanceof Array){ d...

LJXLQXX的博客 260

【JS】自定义JS工具函数库-自定义对象方法-new-instanceof-mergeObject-实现数组与对象的深拷贝与浅拷贝-封装字符串相关函数

文章目录1. 自定义new定义使用结果2. 自定义instanceof定义使用结果3. 自定义合并对象mergeObject定义使用结果4. 对象与数组的深拷贝与浅拷贝4.1 区别深拷贝与浅拷贝4.2 浅拷贝定义1定义2使用结果4.3 深拷贝定义1 使用json的API使用结果定义2使用结果定义3使用结果定义4 最终优化 优化遍历性能 关于 自定义JS工具类 相关类似的源码请看 https://gitee.com/ykang2020/my_utils 1. 自定义new 创建Fn构造函数的实例对象 定义

YK菌的博客 978

JavaScript核心知识点精讲

当请求失败时,调用rejec传递错误信息。使用promise封装ajax的核心要点:把ajax的异步逻辑包裹在promise中,成功调用resolve,失败调用reject,完善异常处理,让封装的函数更健壮。总结:this是在绑定时绑定的,优先级:new调用>call/apply/bind>对象方法调用>普通函数调用,箭头函数特殊,没有自己的this,它是继承外层作用域的this,且无法被修改。简单的说,this是一个动态绑定的关键字,它的值不是在定义时确定的,而是在函数被调用时才确定的。

2503_90598145的博客 550
上一篇: h5 Canvas实现签名写字
下一篇: HTML导出pdf的方式
前端小li
博客等级 码龄7年 14粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值