从 “string.replaceAll is not a function” 中复盘 JQuery.js 兼容性问题

repalceAll不兼容低版本浏览器问题,报错 replaceAll不兼容低版本浏览器问题,报错 阅读详情

分析

意外发现博客的某篇文章在手机端打开的时候一直处于加载中的状态,但是点开其他文章却又是正常的,推断可能是前端页面在渲染的过程中遇到某些错误被中断了。

chrome 浏览器直接打开 mobile 模式还是能正常显示,无法完全模拟手机端的情况

复现

由于手机端的浏览器无法直接进行调试,需要通过 usb 连接到电脑,再使用 chrome 浏览器结合 pc 和手机端进行调试。

手机端调试接入的方式参考:

https://blog.youkuaiyun.com/weixin_32149443/article/details/112936241

这篇博文是转载的,且格式杂乱无章。。csdn的水文真是越来越多了,原文是 cnblog 的一篇文章,但是已经无法显示了,将就着看吧。

接入调试后发现,是文章内容在渲染的时候 jquery.js 抛出了错误,导致内容的渲染被中断了。

image.png

点进错误信息里面我们可以看到异常发生的具体是哪行代码,如下图

image.png

从上图的第二处可以看出,抛出异常的是 formatMath 这个方法,从注释和代码上来看,这个方法的具体作用可能是对文章内容中出现的一些公式做处理。

前期推测可能是传入的某一次循环中传入的 kateBlock 值为 null 对象,导致无法调用 replaceAll 方法(该方法只有在字符串类型时才存在),也就是 Java 中经常遇到的空指针异常(没有在使用某个对象前对其值为空的情况做出处理)只是在 js 体现的不一样。

在渲染别的文章内容时基本没有触发引用 dealMathx 这个方法,所以这个问题也没有被发现。

解决

从 stackoverflow 这篇文章中得知,有可能是浏览器内核对 replaceAll 这个方法的兼容性问题导致的。

本篇文章中的安卓 chrome 版本是 78.x,而不在官方给到的支持版本范围内,如下图

image.png

image.png

到这里我们知道 replaceAll 这个 js api 可能会出现浏览器兼容性问题,是否有其他代替方案?

使用 RegExp 结合 replace 实现 replaceAll 的效果,实现更好的兼容性。

编写一个 escapeRegExp 方法,将部分字符进行转义,返回一个合法的正则表达式字符串

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

自定义 replaceAll

function replaceAll(str, match, replacement){
   return str.replace(new RegExp(escapeRegExp(match), 'g'), ()=>replacement);
}

修改 Xue 主题 main.js 中的 formatMath 方法,将原有的 replaceAll 替换为我们自定义的 replaceAll

/**
 * 格式化公式
 */
function formatMath(kateBlock, isBlock) {
    // 这一步很重要,需要把 & 换成 &
    //var block = kateBlock.replaceAll("&", "&");
    var block = replaceAll(kateBlock,"&", "&")
    if (block.length < 3) {
        return;
    }
    // ... ... 
}

修改即可正常渲染文章的内容(可以使用 halo 自带的主题编辑功能进行测试)

image.png

正则表达式 “误判” 的问题

Halo 博客的 Xue 主题中的 main.js 内用于识别 行内公式 正则表达式错误的匹配到了我文章的内容,并进行了替换,导致文章内容显示异常。

main.js 内的源码:

image.png

正则匹配测试

image.png

渲染错误的效果

image.png

我们来复盘一下这条正则表达式:/\$([\s\S]*?)\$/g

其意义是在字符串全局范围内,匹配以 $ 号开头以及结尾,中间的内容为多个空格或者非空字符(几乎包含了任意字符)

平时很少用 markdown 去写一些公式,所以去查了一下语法,其特征确实是以两个 $ 号来标识为一个公式

image.png

正好这篇文章的 markdown 中有两段内容包含了 ${} 用作 freemarker 的变量,导致内容在渲染出来后被前端替换

image.png

解决方案:

  • 将匹配行内公式的正则表达式中的 [\s\S]*? 替换为 .*? 实现匹配任何非换行符的字符。

    正因为是行内公式,所以也不需要匹配换行符,合情合理。。

  • 且需要考虑文章内也出现包含 \$xxx\$ 的正则表达式的情况

所以最终将 /\$([\s\S]*?)\$/g 替换为 /\$(?!\\$)(.*?)\$(?!\\$)$/g

  • 这里用到了正则表达式中的 负向先行断言 的概念,例如 exp1(?!exp2) 中正则 exp1 匹配的内容需要在正则 exp2 中不成立,想进一步的学习该内容可以参考 这篇文章,这里不就不过多的赘述。

  • 这个问题也间接的让本篇文章所提到的 replaceAll 这个 api 兼容问题浮出了水面 🤣

总结

  • 在使用第三方库(例如 JQuery.js)时,尽可能使用更兼容型的 api 去实现需求。

  • 在使用正则表达式对某些内容最匹配时,尽可能更多的特征条件,避免错误的匹配。

  • 浏览器会缓存js文件,在修改后,最好先清空缓存,或打开控制台 network 勾选 Disable cache 在进行测试。

参考资料

YOLOv8验证的命令以及计算coco指标 好久不看代码,都不知道怎么验证的了,来记录一下。1、计算coco指标。 阅读详情

相关推荐

无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

时差估计算法之精确时差估计(ETDE)欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想

伊谢尔伦的林中小路 4255

JavaScript String.prototype.replaceAll 兼容性导致的问题

Intro 本地开发、测试好的项目,发布到线上正常运行。 换了一个浏览器去访问却报错: 原因: 低版本浏览器不支持字符串的replaceAll方法 见MDN String.prototype.replaceAll 验证 查看运行出问题的浏览器的版本信息: chrome: firefox: 当然也可以通过界面去查看浏览器版本(firefox, chrome, …等不同厂商的浏览器,查看方式也不同) 解决 举个例子,对于文本abc 123 ab 12 cd,搜索12 基于replaceAll可以得

wuyujin1997的博客 1万+

ITIL 4 讲解:服务目录

最近一直比较忙,没有时间写文章了。今天有空,写写服务目录。 在最近的项目中,服务目录是比较热的话题。金融行业大部分银行、证券、金融公司都实行ITIL流程管理有些年头了,ITIL中最基础的服务请求、事件、问题和变更都已经实施完毕,目前客户在运维领域做的项目大部分都要求整理服务目录,实行服务级别管理。 服务目录介绍 首先解释一下什么是服务目录。服务目录在ITIL 4的定义是:有关服务提供商的所有服务和服务产品的结构化信息,与特定目标受众相关。这个解释有些晦涩难懂,简单来说就是提供给业务用户的服务项,就像饭

雅子MM的专栏 6467

js中replaceAll在浏览器不兼容问题

前端项目有时候会出现浏览器使用replaceAll方法报错问题,原因是一些旧版浏览器对replaceAll不是很兼容。g 的意义是:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。这样就可以像使用replace 方法一样使用replaceAll了。g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。

5big的博客 3407

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

YOLO11涨点优化:原创自研 | 魔改Bottleneck,具备多尺度和特征通道融合的结构

可以将C3k2_MSAMCS放在neck,或者backbone和neck同时修改,具体看自己数据集的涨点情况决定

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

解决replaceAll报错:string.replaceAll is not a function

解决方法是不使用replaceAll,而是使用replace全局替换。问题原因是浏览器器版本太低了,现Chrome仅85以上支持。

hello world 3670

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

JS报错Uncaught (in promise) TypeError: (intermediate value).format is not a function

出现“date.format is not a function”错误是因为格式方法未在 JavaScript 中实现。意思是说Format不是一个方法。去查了一下,发现是javascript已经去掉此方法了,要使用的话,需要添加第三方库。要解决该错误,需要使用第三方包来格式化我们的日期,例如 moment 或 date-fns。

My note 7147

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

Cadence 17.4版本导出坐标文件往往都是txt格式,并且无标题、导出时间、导出设计工程多名称等信息。那么怎么样才能导出有带这些信息的excel版本并格式好看的坐标文件呢?

一点硬件 2763

010、Zephyr RTOS开发环境搭建(Docker)

摘要 本文分享了使用Docker搭建Zephyr RTOS开发环境的实践经验。作者通过团队新人配置环境的真实案例,指出传统安装方式存在版本冲突、缓存污染等问题,而Docker方案能确保环境一致性。文章详细介绍了自定义Docker镜像的设计思路,重点解决工具链版本匹配、Python虚拟环境隔离等问题,将镜像体积从2GB优化到800MB。提供了从拉取镜像到点亮LED的完整工作流程,并总结了USB设备直通、文件权限、缓存问题等常见陷阱。还探讨了多阶段构建、CI集成等进阶用法,同时客观分析了Docker方案的局限性

m0_50546716的博客 79

String.prototype.replaceAll 兼容性问题

String.prototype.replaceAll 兼容性问题

鲸落 1564

beegfs读取文件完整流程分析

读取小于512KB文件数据,小于1s 读取15MB文件数据,花费7秒。

wfzy的博客 835

巧遇replaceAll报错:string.replaceAll is not a function

报错 replaceAll is not a function

weixin_49985592的博客 3235

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

千万别用 replaceAll | 兼容性问题 | 踩坑记

博主吃了 replaceAll 方法的坑,该方法有严重的兼容性问题,部分手机完全不支持这个方法导致报错。

落叶无声的专栏 939

深度学习工具包 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")

浏览器不兼容 replaceAll 方法问题解决

在一些较旧版本的浏览器中可能会出现 replaceAll 方法不兼容,提示replaceAll 方法 undefined 的问题,可以通过...

jiangjunyuan168的博客 2556

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

报错:str.replaceAll is not a function

浏览器版本问题,replaceAll函数要求谷歌浏览器版本为85以上。想替换所有的"你好"为空字符串。

m0_72644324的博客 783

记录一个查询兼容性的网站,String.replaceAll()兼容性报错

css、js的兼容性查询网站 Can I use replace()代替replaceAll()

ZMJ_QQ的博客 838

js中通过正则取代replaceAll,解决replaceAll部分浏览器不兼容问题

通过正则替换字符串中所有匹配字符,解决replaceAll兼容性问题

lys20000913的博客 1478

使用jquery报错replace is not a function

1,情景描述:做项目的时候想把内容的某些字符给替换成另外一些字符 2,replace用法:replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 3,我在页面用replace的时候却报错了,错误信息为replace is not function ,jquery文件已导入,并且在同一个页面的其他地方有用过,然后我就纳闷了,后来调试发现这个函数只能用于...

笨小蛋的博客 2万+

js报错 replaceAll is not a function

牛客网用JavaScript V8,发现没有replaceAll的方法,replace只能替换第一个遍历到的元素,换个方式实现替换所有的效果 n=n.replace(new RegExp(arr[i],'g'),''); 把n里面的arr[i]的字符替换成空

wnk1997的博客 5452

VirtualBuddy性能调优终极指南:10个快速提升虚拟机运行速度的技巧

VirtualBuddy是一款专为Apple Silicon设计的macOS虚拟机软件,让您能够在M1、M2、M3芯片上虚拟运行macOS 12及更高版本。对于追求极致性能的用户来说,掌握正确的性能调优方法至关重要。本文将分享10个实用的VirtualBuddy性能优化技巧,帮助您显著提升虚拟机运行速度。✨ ## 🚀 内存配置优化策略 合理分配内存是提升VirtualBuddy性能的首要步骤

gitblog_00471的博客 405

replaceAll is not a function 详解

在chrome 浏览器中使用 replaceAll 报这个错误,是因为chrome 版本过低, 在chrome 85 以上版本才支持

kirinlau的专栏 2899

字符串方法replaceAll()的使用及替代方法

1.需求 替换字符串中所有的“<”和“>”符号 2.分析 str.replace(被替换字符串,替换字符):只能替换字符串中的首个被替换字符串。 str.replaceAll(被替换字符串/正则表达式,替换字符):可以替换字符串中的所有被替换字符串 3.问题 replaceAll()方法不是所有浏览器都支持。比如pc端的微信浏览器内核(我这里就是因为在微信里打开项目发现replaceAll()方法报错),ie浏览器等。 浏览器对replaceAll()方法兼容性查询: 4

weixin_46917162的博客 5380

TypeError: str.replace is not a function

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 操作对象如果不是字符串会报错: let str=20 str=str.replace(/\s*/g,"") 解决: str=str.toString().replace(/\s*/g,"") ...

weixin_40030173的博客 5162
上一篇: 通过 Java 反射复用 MyBatis Plus 的 QueryWrapper 条件值
cory_lin
博客等级 码龄7年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值