Javascript性能优化

JavaScript 性能优化实战【详细指南】 JavaScript 作为现代 Web 开发的核心技术,其性能优化涵盖多个关键领域,包括 代码执行效率、DOM 渲染优化、异步处理、内存管理、网络请求优化、动画与交互优化 等。随着 Web 生态的不断演进,许多新技术(如 WebAssembly、OffscreenCanvas、Streams API、WebGPU、V8 TurboFan、Priority Hints、ResizeObserver、Web Animations API 等)正在显著提升 JavaScript 的执行效率和渲染性能。 阅读详情

JavaScript性能研究

@author huangteng


前言

有关javascript性能的探究,目的只是找出性能提升的最佳途径。
我们执着于性能提升,也就是为了给用户带来最好的体验。
其实一说起性能,大概脑子里第一反应就是同步执行和异步执行。
当然,大家都会选择交替的并发执行(异步)的方式,这样减少阻塞,使得
我们的应用更加流畅。

本次探究我们分为两个层次,一个是程序级别的性能研究,一个是微性能的研究,比如
a++ , ++a 哪个更快?

再次谈谈javascript实现多线程

我们都知道javascript是单线程的,而且目前仍然是这样,不会诞生别的变化。我们也知道,如果能够像多cpu机器一样并行执行多任务,当然是最佳方案。

既然javaScript办不到,我们想想别的呢,HTML5的新特性,Worker,从浏览器实现了多线程的方式运行我们的js代码。其实也就是浏览器可以同时运行多个Js引擎,从而实现多线程式的效果。但是这样的方式又不想我们熟悉的多线程语言,比如java,C++等,多线程之间共享作用域和资源,这样对资源的访问必须依靠锁机制来维持顺序。

Worker建立的多线程并不会共享作用域和资源,线程之间完全依靠事件消息机制相互联系

Web Worker在耗时计算密集型操作中,显得特别实用。在WebWorker中我们可以实现:
1. 可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信;
2. 可以在worker中通过importScripts(url)加载另外的脚本文件;这些脚本加载是同步的。也就是说,importScripts(..) 调用会阻塞余下 Worker 的执行,直到文件加载和执行完成。
3. 可以使用 setTimeout(),clearTimeout(),setInterval(),clearInterval();
4. 可以使用XMLHttpRequest、WebSockets来发送请求,以及访问navigator、location 、JSON 和 applicationCache 的部分属性。

Worker中的数据传递现在不仅仅只依靠字符串了,感兴趣了解一下结构化克隆数据和
transferrable

有关Worker的用法,如下:

主线程:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>main process</title>
</head>
<body>
    <div>
        <h1>这是主线程中的页面</h1>
    </div>
    <div style=" width: 500px ;height:500px ;background: #e8e8e8">
        <div  style="width: 500px ;height:200px ;background: #e8e8e8">
            <h3 id="result"></h3>
        </div>
        <div style="width: 500px ; height: 100px ;position: absolute; bottom: 0px">
            <button style="width: 80px ;height:30px;border-radius: 5px" onClick="start()">startWorker</button>
            <button style="width: 80px ;height:30px;border-radius: 5px" onClick="end()">endWorker</button>
        </div>
    </div>
</body>
<script type="text/javascript">
    // 利用python启动一个简单的服务
    // 建立一个worker,参数是一个js文件路径
    // 工作线程里面一般是很耗cpu的操作,这里的demo简单的实现主线程和工作线程之间的通话。
    var w1;
    function start(){
        if(typeof(Worker) !== 'undefined'){
            if(typeof(w1) === 'undefined'){
                w1 = new Worker('/worker1.js');
            }

            // 建立与工作线程的通信;postMessgae-发送信息;onmessage-监听接收信息;在工作线程里面是相对的操作。
            var i = 100;
            w1.postMessage(i);

            w1.onmessage = function(evt){
                document.getElementById('result').innerHTML=evt.data;
            }
        }else{
            document.getElementById('result').innerHTML = 'current browser not support worker!';
        }
    }
    // 停止工作线程
    function end(){
        w1.terminate()
    }

</script>
</html>

工作线程 work.js:

(function(){
    console.log('worker: ','<h4>这是一个Worker里的</h4>')
    var rep = 0 ;
    addEventListener('message',function(evt){
        rep = evt.data + 200;
    })
    setTimeout(function(){
        postMessage('给你的哦!'+ rep);
    },2000)
})()

更多内容比如sharedWorker,就是几个页面共享一个工作线程。
假如下面的页面有多个

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>main2</title>
</head>
<body>
    <input type="text" style="width: 200px;height:25px;border-radius: 5px;background: #e8e8e8" id="text" /><input type="button" onClick="start()" style="margin-left:30px;width: 50px;height:25px;border-radius: 5px;background: #e8e8e8" value="send"/>
    <script type="text/javascript">
        (function callee(){
            var itv=setTimeout(function(){
                console.log("timeout!");
                callee();
            },1000);
            // 这里主要验证一下sharedWorker
            // 方法就简单写了,主要说明sharedWorker的消息传递
            // 共享worker就是几个页面或者tab共享一个worker,他们之间的消息传递就需要通过port来区别开来
            // 这里的demo通过一个页面的输入在另一个页面显示,中转的地方是sharedworker来演示
            new SharedWorker('sharedworker.js').port.onmessage = function(evt){
                if(evt.data.name=="connected")
                    clearTimeout(itv),console.log("connected~");
            }
            console.log("connecting...")
        })()
    </script>
</body>
</html>

共享线程,sharedworker.js:

onconnect=function(e){
  e.ports[0].postMessage({name:"connected"});
};

可以参考:https://www.ibm.com/developerworks/cn/web/1112_sunch_webworker/

性能测试与调优

上述部分是针对程序级别的宏观的性能研究,其实这完全依赖与Ecma标准的发展,未来不排除激进的让javaScript变成多线程的语言。

本节的内容主要针对的是微性能的探究。

代码测试

js中对一段代码测试,大多数人采用的方法是这样的

var start = Date.now();
// 这里是你的测试片段...
var end = Date.now();
console.log('run time',end-start);

这样的测试基本是无效的,你要考虑平台精度,方法执行的延误,样本的数量,最大最小的离散偏差…

测试应该是统计学的结果。我们不擅长无所谓,可以借助第三方工具,比如Benchmark.js
、jsPerf等…

这里以Benchmark.js的使用为案例,写一个测试demo,有兴趣的可以自己学习一下上面说的两种测试工具的使用。

/*
 * @author: 
 * @description: 测试 "+" 和 join性能
 * @version:
 * @time:
 */

 const Benchmark = require('benchmark')
 const suite = new Benchmark.Suite;

 var test1 = ()=>{
    var res = '';
    var num = 100000;
    while(num--){
        res += '<a></a>'
    }
 }

 var test2 = ()=>{
    var arr = [];
    var num = 100000;
    while(num--){
        arr.push('<a></a>')
    }

    arr = arr.join('');
 }

 suite.add('+ test',function(){
    test1();
 }).add('join test',function(){
    test2();
 }).on('cycle',function(evt){
    console.log(String(evt.target))
 }).on('complete',function(){
    console.log('Fastest is '+ this.filter('fastest').map('name'))
 }).run({'async':true})

运行结果:

+ test x 583 ops/sec ±8.44% (51 runs sampled)
join test x 184 ops/sec ±8.36% (55 runs sampled)
Fastest is + test
[Finished in 25.5s]

说明在100000次简单拼接的时候,字符串”+”拼接更快
其中ops/sec代表每秒执行次数,这个值越大说明性能越好
后面的XXX%代表系统误差。

benchmark的缺陷就是不能代表所有的环境,假如你在IE上测试出X性能 > Y
不代表在chrome上就会成立。

为了解决这一问题,jsPerf.com,这个网站诞生了,他其实也是run的是benchmark,
只是支持了不同的浏览器环境,还可以在线分享,累积测试,浏览器性能测试等。
至于jsPerf做测试以及在线分享,有兴趣的可以自己去学习一下。
这是我jsPerf的测试结果:https://jsperf.com/huangtengTest123
你可以把这个地址在不同浏览器打开测试性能。

现在你可以尽情的测试你以前写的代码了,也可以解答你的困惑,++a,a++到底谁更快,
我要提醒的是,不要沉迷于代码性能提升,要环境为主,人的感知,比如肉眼能感觉到的极限应该是100ms左右,也就是你的程序性能低于这个值当然牛逼,再继续提升性能就没有多大实际意义,因为反正人类已经感觉不出来了。

微性能

针对具体到某一段代码的优化,我是不可能举出所有列子的,在开发中应该注重代码测试,选择最好的性能代码。但是不要过度的执迷于代码的性能追求。

你写的代码在运行的时候,经过编译的几个步骤,打散成单元,重构AST,运行,可能就不是你写的那个样子了,所以探究是为了实际开发,不要钻牛角尖。

比如前面提到的类似的 –a 和 a– , 在汇编的层次,–a 是首选。但是你实际测试一下,会觉得差别微乎其微。
再比如一个字符串”42”转成数字类型再/2,有很多方法:

parseInt('42')/2;
Number('42')/2;
+'42'/2;
('42'|0)/2
'42'/2;
...

哪一个更快?
其实这要结合实际,综合考量,比如 +’42’的方式快于parseInt,但是可读性差。

我们应该关注优化的大局,而不是担心这些微观性能的细微差别。

这里补充一个ES6的优化细节。CTO(“尾调用优化”)
就是指在一个函数(假设叫bar)的尾部调用某个函数(假设叫foo),而foo的尾部不会再调用其它函数了,而是直接返回一个结果或者别的。

ES6要求引擎实现了CTO,这样的好处是尾调用不会在bar里创建栈帧,这就节省了内存开销。
虽然看似没什么广泛的用途,但是在递归里面,你可以脑补,简直美如画啊。

有关js性能优化就到这里。

连载:JavaScript性能优化实战 【10章,11章,12章】现代JS性能优化,移动端优化,性能优化工具工作流 探讨了ES6+特性优化策略,包括箭头函数与普通函数的选择、模板字符串与拼接的对比,以及WebAssembly在计算密集型任务中的应用。移动端优化重点包括触摸事件处理(passive监听器)、内存管理(缓存控制)和网络感知加载策略(根据网络条件调整资源质量)。工作流工具章节介绍了自动化性能测试(Benchmark.js)、持续监控集成(CI/CD阈值检测)和构建优化(Webpack配置、代码分割)。最后详述了运行时性能监控SDK的实现,涵盖性能指标收集、错误跟踪 阅读详情

相关推荐

JavaScript性能优化实战

本文介绍了JavaScript性能优化的实战方法,重点解决前端开发中常见的卡顿、加载慢等问题。通过「问题定位→优化→验证」流程,详解5个高频场景的优化方案:1)用requestIdleCallback拆分长任务;2)减少DOM重排与重绘;3)事件委托与防抖节流;4)避免内存泄漏;5)代码打包优化。强调使用Chrome Performance等工具量化瓶颈,针对性优化后需数据验证效果。核心原则是平衡性能与代码复杂度,持续迭代优化以提升用户体验。文末附常用性能检测工具清单。

chuxuezhebai的博客 697

javascript多线程--web workers实现线程间数据交互的小测试

实现一个非常简单的web workers例子: 一.先来看一个反面教材: 模拟一个耗时运算用传统方式实现。 Title var num = 5000000000; var r = 0; var i=num; for (;i;i--) { r += i; } //直接处理耗时操

McDull的博客 2411

JavaScript 性能优化与测试指南

本文深入探讨了 JavaScript 中的性能优化技术,包括 asm.js 的使用、内存分配策略、以及代码级别的性能测试方法。文章详细分析了 asm.js 如何通过特定的代码模式提示 JavaScript 引擎进行优化,以及在编写高性能代码时需要考虑的内存管理策略。同时,还介绍了如何通过 Benchmark.js 等工具来科学地测试 JavaScript 代码的性能,并指出了在性能测试中常见的误区和陷阱。

weixin_32456485的博客 979

【test】我的js web Worker测试

http://www.w3school.com.cn/html5/html_5_webworkers.asp //页面js代码 &lt;script&gt; var w; function startWorker() { if(typeof(Worker)!=="undefined") { if(typeof(w)=="undefined") { w=new Worker(...

qq_15941409的博客 478

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

397

spring-ai 1.0.0 学习(四)——提示词管理

摘要:本文介绍Spring AI中提示词管理的最佳实践。首先展示基础样例,指出直接传递用户输入的局限性。随后分析优质提示词应包含系统消息、上下文信息、输出结构和问答样例四要素。文章详述两种实现方式:链式调用(使用ChatClient构建器)和传统对象创建方法。进阶部分涵盖核心接口(Prompt、Message等)、消息类型、模板渲染配置(支持自定义)及提示词工程技巧(如RAG、任务分解)。最后提及高级功能如少样本模板和提示词库。全文强调结构化提示词对提升AI输出质量的关键作用,并展示Spring AI的灵活

hzp的专栏 1365

前端Web性能优化实践:从加载到渲染的全面提速

在Web开发中,性能优化是一个永恒的话题。在本文中,我将分享一些前端Web性能优化的实践方法,帮助你提升网页的加载速度和渲染效率。使用requestAnimationFrame:对于动画效果或高频率的UI更新,使用requestAnimationFrame来确保每一帧的渲染都在浏览器的下一次重绘之前执行,从而实现流畅的动画效果。Service Workers:使用Service Workers技术可以在浏览器后台运行脚本,实现资源的离线缓存和推送通知等功能,进一步提升应用的性能和用户体验。

liyunhua258的博客 834

华为 MetaERP 通过元数据驱动的多组织架构 + 内部交易协同 + 自动对账引擎 + 合并规则引擎,实现多组织内部往来与合并报表的全流程自动抵消,核心是源头标准化、过程自动化、结果可追溯

摘要: 华为MetaERP通过元数据驱动的多组织架构与主数据标准化,实现内部往来与合并报表全流程自动化。其核心包括:统一组织模型与主数据(确保数据口径一致)、内部交易协同(自动生成对称凭证)、智能对账引擎(多维度自动匹配差异)、合并规则引擎(配置化抵消模板)。依托GaussDB高性能数据库与流批一体架构,华为全球88家子公司合并报表效率提升400%,关账时间缩短至2小时,支持多准则、多币种自动抵消,审计全程可追溯。相比传统ERP,MetaERP在协同性、自动化与扩展性上优势显著,为跨国集团提供高效、准确的合

金牌架构师 264

JavaScript中利用H5的Web Workes 实现多线程的运行测试

JavaScript中利用H5的Web Workes 实现多线程的运行测试

weixin_44692588的博客 431

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2905

【数据集】中国区域地面气象要素驱动数据集(CMFD)2.0

中国区域地面气象要素驱动数据集(CMFD)2.0

WW、forever的博客 2976

高性能JavaScript之 Web Workers

大多数浏览器让一个单线程共用于执行 JavaScript 和更新用户界面。每个时刻只能执行其中一种操作,这意味着当 JavaScript 代码正在执行时页面无法响应输入,反之亦然。当 JavaScript 代码执行时,用户界面处于 ‘锁死’ 状态。 用于执行 JavaScript 和更新用户界面的进程通常被称为 ‘浏览器UI线程’。UI 线程的工作基于一个简单的队列系统,任务会被保存到队列中知道进...

薛小科的博客 233

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 364

css js 性能优化,JavaScript前端性能优化

JS性能优化的知识非常庞杂,这里我们来介绍几种常用的性能优化方式。一、JS中的前端性能优化原则:多使用内存、缓存等方法减少CPU计算、减少网络请求二、针对上述两项原则,我们可以从两个方向入手来进行前端的性能优化。1、加载资源优化静态资源的压缩合并我们可以利用webpack等打包工具进行资源的合并与压缩操作,可以大大减小资源的大小,实现页面更快的加载。静态资源缓存当浏览器发送请求时,可以检测该资源的...

weixin_33487811的博客 509

4、机器人建模、规划与控制及运动学知识解析

本博客深入解析了机器人建模、规划与控制的核心内容,涵盖运动学与动力学的基本原理,并结合典型应用场景探讨了移动机器人与操作器的控制策略。同时,博客还介绍了机器人技术的发展趋势及其在工业和服务领域的广泛应用。

desk3的博客 122

【系统分析师】2025年下半年真题:论文及解题思路

摘要 本文探讨软件测试技术的应用,重点关注静态测试与动态测试的比较。静态测试在不运行程序的情况下,通过审查、走查等方式分析需求、设计文档和代码,能早期发现高层次缺陷,降低修复成本。动态测试通过实际运行程序,使用单元测试、集成测试等方法验证功能性能,是发现运行时错误的唯一途径。二者在缺陷类型、介入阶段和修复成本上具有互补性,建议项目实践中结合使用以提升软件质量。

数据知道的博客 5785

无依赖JavaScript插件:PriorityNavigation.js性能优化技巧

PriorityNavigation.js是一款纯JavaScript插件,能在菜单项不适合其父容器时自动移动它们,实现Priority+ Navigation功能且无任何依赖。它为网站导航提供了智能解决方案,尤其适合需要响应式设计的现代网站。 ## 为什么选择PriorityNavigation.js? 这款插件具有多项优势,使其在众多导航解决方案中脱颖而出: - **零依赖**:采用纯J

gitblog_00780的博客 939

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

js和java 性能优化,JavaScript性能优化

1、使用局部变量在函数中,总是使用var来定义变量。无论何时使用var都会在当前的范围类创建一个局部变量。如果不使用var来定义变量,那么变量会被创建在window范围内,那么每次使用这个变量的时候,解释程序都会搜索整个范围树。同时全局变量要在页面从浏览器中卸载后才销毁,而局部变量在函数执行完毕即可销毁,过多的全局变量增加了不必要的内存消耗。只要有可能就应该用局部变量或者数字索引的数组来替代命名特...

weixin_36193690的博客 3383

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaScript性能优化篇js优化

http://www.111cn.net/wy/js-ajax/43542.htm JavaScript性能优化篇js优化 我在本文中将指出一些重要的规则,介绍如何使用你的JavaScript、使用哪些工具以及你将从中得到什么好处。 确保代码尽量简洁   不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具,只是起到美化

yan_dk的专栏 1242

精雕软件(JDpaint) 5.5 绿色版

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

Hammer.js终极性能优化指南:从JavaScript到WebAssembly的进阶之路

Hammer.js作为一款强大的JavaScript多点触控手势库,为Web应用提供了流畅的触摸交互体验。本指南将揭示从基础优化到高级进阶的完整路径,帮助开发者充分释放Hammer.js的性能潜力,打造响应迅速的触控应用。 ## 🌟 核心性能优化策略 ### 1️⃣ 启用单用户触摸处理模式 Hammer.js提供了专为单用户场景优化的触摸处理模式,能显著提升单点触控性能。通过启用`singl

gitblog_01104的博客 1146

【原生JS】从语言底层分析与性能优化JavaScript指南

本文深入探讨JavaScript性能优化的核心原理与实践策略,涵盖V8引擎架构、JIT编译、内联缓存等底层技术。主要内容包括:1)解析V8引擎的隐藏类优化机制;2)详解JIT编译与多态内联缓存技术;3)提供变量声明、循环结构等语法优化方案;4)对比不同数据结构的性能差异。通过预定义对象结构、缓存循环长度等具体优化技巧,帮助开发者编写高性能JavaScript代码。文章结合丰富代码示例,展示了从基础语法到高级编译优化的全方位性能提升方法。

silverclayz的技术分享 853

javascript性能优化四 之堆栈中js执行过程等

JSBench的使用 jsperf已经停止维护了,介绍一个新的www.jsbench.me性能测试网站 堆栈中的JS执行过程 通过画图的方式走一遍上面代码块的流程 当浏览器真正要执行代码的时候肯定有一个执行上下文的环境的ECStack,用于存放执行上下文。 Js代码在开始执行之后首先会在堆内存里创建一个执行环境栈,然后用他来存放着不同的执行上下文,代码从上往下执行最先创建的是应该是EC(G全局执行上下文),在下面把代码都执行了申明和存放,基本数据类型是存放在栈内存里的,而对于引用类型来说是存放在堆区里

山有木兮的博客 402

js和java 性能优化,JavaScript 性能优化技巧分享

原标题:JavaScript 性能优化技巧分享来自:葡萄城控件链接:cnblogs.com/powertoolsteam/p/java-performance-optimization.html原文:sitepoint.com/java-performance-optimization-tips-an-overview/Java 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中...

weixin_34660766的博客 522

vscode-js-debug性能优化指南:如何快速调试大型JavaScript应用

vscode-js-debug是一款兼容DAP协议的JavaScript调试器,广泛应用于VS Code等开发环境。对于大型JavaScript应用,调试性能往往成为开发效率的瓶颈。本文将分享实用的性能优化技巧,帮助开发者快速定位和解决调试过程中的性能问题,提升调试体验。 ## 一、启用自动附加调试功能 自动附加调试功能可以让vscode-js-debug在Node.js进程启动时自动附加,避

gitblog_00001的博客 387

【JavaScript】前端的性能优化(js)

前端的性能优化(js)

时间飞逝的博客 428

JavaScript性能优化实战:Next.js 性能优化——静态生成和服务器端渲染

本文深入探讨Next.js框架的性能优化策略,重点解析静态生成(SSG)和服务器端渲染(SSR)两种核心机制。通过分析其工作原理、适用场景及优化技巧,包括数据预取、懒加载、缓存策略等实战方法,帮助开发者构建高性能应用。文章还介绍混合渲染策略、性能度量工具及常见问题解决方案,提供从理论到实践的完整优化路径,最终达到首屏加载<1秒、Lighthouse评分>90的性能目标,适合各类Web应用的性能提升需求。

qinzhenyan的博客 1127
上一篇: 一个不一样的ajax
下一篇: 持续更新-ES6全面解析
波比小金刚
博客等级 码龄11年 41粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值