javascript内存回收机制

系统理解javascript中的数据类型、堆内存栈内存、js的垃圾回收机制、深拷贝浅拷贝原理 前言 本身在面试博客里只是想整理一下js的类型,突然越联想越感觉这块的知识体量比较大,扩展很多,但网上的很多理解繁杂还不太清晰,故此专门记录一下这几个点。 正文 js中的数据类型 基本类型:number ,string,null,Boolen,undefined,symbol 引用类型:object (Array,Function,Date,Regxp在es6中规定都是object类型) 两... 阅读详情

1.碎碎念

讲到了javascript变量,在上一篇中蜻蜓点水地提到了变量的内存分配,但是对内存的回收却没有详细的说明,这是我的一大疏忽。今天就专门来聊聊javascript的内存回收机制。javascript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation)

2.初识GC

javascript和C#、Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题。JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

通常我们使用new创建对象,GC负责回收对象占用内存区域.因此了解GC,可以加深对javascript垃圾回收机制的理解。

垃圾回收原理:

找出内存中不再继续使用的变量,将其所占用的内存释放,开发人员不再关心内存的使用情况,内存的分配已经无用内存的释放完全实现了自动化管理.

变量生命周期

这里很多人会困惑,什么叫不再继续使用的变量?不再继续使用的变量就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后再函数中使用这些变量,直至函数结束(闭包中由于内部函数的原因,外部函数并不能算是结束)

 
  1. <SCRIPT LANGUAGE="JavaScript">  
  2.       <!--  
  3.     //猫  
  4.     function cat(name){  
  5.         var zhuren ;  
  6.         this.name = name;  
  7.           
  8.         //设置主人  
  9.         this.addZhuRen = function(zr){  
  10.             zhuren = zr;  
  11.         }  
  12.  
  13.         this.getZhuRen = function(){  
  14.             return zhuren;  
  15.         }  
  16.     }  
  17.       
  18.     //主人  
  19.     function zhuren(name){  
  20.         this.name = name;  
  21.     }  
  22.  
  23.     //创建主人:  
  24.     var zr = new zhuren("zhangsan");  
  25.     //创建猫  
  26.     var cat1 = new cat("asan");  
  27.     //设置该猫的主人  
  28.     cat1.addZhuRen(zr);  
  29.     //释放主人  
  30.     zr = null ;  
  31.     //此处还存在对主人对象的引用  
  32.     alert(cat1.getZhuRen().name)  
  33.       //-->  
  34.   </SCRIPT>
)。

一旦函数结束,局部变量就没有存在必要了,可以释放它们占用的内存。貌似很简单的工作,为什么会有很大开销呢?这仅仅是垃圾回收的冰山一角,就像刚刚提到的闭包,貌似函数结束了,其实还没有,垃圾回收器必须知道哪个变量有用,哪个变量没用,对于不再有用的变量打上标记,以备将来回收。用于标记无用的策略有很多,常见的有两种方法。

垃圾回收的方法有2种: (1)标记清除 (2)引用计数

标记清除(mark and sweep):

目前javascript最常用的一种垃圾回收机制.

当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。垃圾收集器在运行时会给存储在内存中的所有变量都加上一个标记,然后检查哪些变量还在环境中使用,将去掉这些变量的标记,检查哪些变量被环境中的变量说引用,也去掉这些变量的标记,最后剩下的这些带有标记的变量将会是"准备被清理的变量"。至于怎么标记有很多种方式,比如特殊位的反转、维护一个列表等,这些并不重要,重要的是使用什么策略,原则上讲不能够释放进入环境的变量所占的内存,它们随时可能会被调用的到。

垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了,因为环境中的变量已经无法访问到这些变量了,然后垃圾回收器相会这些带有标记的变量机器所占空间。

大部分浏览器都是使用这种方式进行垃圾回收,区别在于如何标记及垃圾回收间隔而已,只有低版本IE使用的引用计数。

引用计数(reference counting):

这是一种不太常用的垃圾回收机制.

在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。

看起来也不错的方式,为什么很少有浏览器采用,还会带来内存泄露问题呢?主要是因为这种方式没办法解决循环引用问题。比如对象A有一个属性指向对象B,而对象B也有有一个属性指向对象A,每个对象的ref属性引用另外一个对象,如下代码

var A=new Object();
var B=new Object();
A.ref=B;
B.ref=A;
这样的相互引用,导致A,B俩个引用计数都是1,永远没有变成0的时候,这时垃圾收集器将永远不会对其进行清理.

既然提到了IE,我们在多聊点。

在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的,也就是说只要涉及BOM及DOM就会出现循环引用问题。看上面的例子,有人会说,这肯定是个菜鸟,高手不会做这么无聊的事情,其实非也!看一下这段代码:

window.onload=function outerFunction(){
        var obj = document.getElementById("element");
        obj.onclick=function innerFunction(){};
    };
这段代码看起来没什么问题,但是obj引用了document.getElementById(“element”),而document.getElementById(“element”)的onclick方法会引用外部环境中的变量,自然也包括obj,是不是很隐蔽啊。

解决办法

最简单的方式就是自己手工解除循环引用,比如刚才的函数可以这样

window.onload=function outerFunction(){
       var obj = document.getElementById("element");
       obj.onclick=function innerFunction(){};
       obj=null; //没有用的对象及时赋值为null
    };
什么时候触发垃圾回收?

垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。

IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种情况的时候就会触发垃圾回收器工作,看起来很科学,不用按一段时间就调用一次,有时候会没必要,这样按需调用不是很好吗?但是如果环境中就是有这么多变量等一直存在,现在脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工作,这样浏览器就没法玩了。

微软在IE7中做了调整,触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临街条件翻倍,如果回收的内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工作职能了很多。

同C# 、Java一样我们可以手工调用垃圾回收程序,比如IE浏览器中 ,调用 windows.CollectGarbage() 或者opera7及更高版本,调用 window.opera.collect()也可以启动垃圾回收器.但是由于其消耗大量资源,而且我们手工调用的不会比浏览器判断的准确,所以不推荐手工调用垃圾回收。

为了更好,更有效的使用内存,我们建议没有用的对象及时赋值null,这样对象将会快被垃圾收集器处理.

 3.深度解析GC

1)用局部变量和全局变量解释GC

GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用是GC的关键所在.

    <script>  
            function aa(){  
                this.rr = "testA";      
            }  
            function bb(){  
                this.rr = testB";  
            }  
            var b1;  
            function cc(){  
                var a1 = new aa();  
                b1 = new bb();  
                return b1;  
            }  
            cc();  
            alert(b1.rr)  
        </script> 

如上代码中,执行完cc()后a1被回收了,此后我们可以通过b1.rr弹出"testB".在一些基础书籍中解释为:a1为局部变量,b1是全局变量.局部

变量执行完后会被GC回收.但不全是这样,如下代码:

    <script>  
            function aa(){  
                this.rr = "testA";      
            }  
            function bb(){  
                this.rr = "testB";  
            }  
            function cc(){  
                var a1 = new aa();  
                var b1 = new bb();  
                    return b1;  
            }  
            var b1 = cc();  
            alert(b1.rr);  
        </script> 
此时cc函数中的 a1,b1都是局部变量,但仍然会弹出"testB".说明b1并没有被GC回收.因此JavaScript中局部变量不是所有时候都被GC回收的.

这个例子的编译时的内存分配图比较简单,有兴趣画一画的读者可以参照javascript变量之作用域。

下面我们再举个例子深入理解.

局部变量在函数返回以后,并不一定会被立即回收,而是会等待不再被引用的时候,才会被回收!下面局部变量i在函数test返回以后,仍然存在,因为有m一直引用着该数组。但一旦手动将 m = null,该数组将因为无引用被自动回收。
function test(){  
  var i = [1,2];  
  return i;  
}  
var m = test();  
alert(m);//1,2  

2)抽象理解GC

我们再进一步里了解一下GC回收机制,先引入几个概念:双向链表,作用域链,活动对象), 其中双向链表描述复杂对象的上下层级关系. 作用域链与活动对象分别是双向链表中的某个节点.承接第一个例子,以函数cc为例变量层级关系为:

在执行cc()方法时,内存中变量的引用关系如下:

window<=>cc<=>a1<=>rr<=>b1<=>rr 

window的活动对象包括cc,假设window是顶级对象(因为运行中不会被回收)

cc的活动对象包括a1和b1,其作用域链是window

a1的活动对象包括rr,其作用域链是cc

b1的活动对象包括rr,其作用域链是cc

执行cc()时,cc的执行环境会创建一个活动对象和一个作用域链.其局部变量a1,b1都会挂在cc的活动对象中.当cc()执行完毕后,执行环境

会尝试回收活动对象占用的内存.但因局部变量b1 通过return b1,为其增加了一条作用域链:window<=>b1<=>rr,所以GC停止对b1回收.

因此如果想将一个局部变量/函数提升为全局的,为其增加一条作用域链就OK了。

同时控制好对象的作用域链也变得重要了.因作用域链会意外导致GC无法回收目标对象.这里引入一个经典的例子:

<script>   
    function cat(name){  
        var catHost;  
        this.name = name;  
        this.addCatHost = function(host){  
            catHost = host;  
        }  
        this.getCatHost = function(){  
            return catHost;  
        }  
    }  
    function Host(name){  
        this.name = name;  
    }    
    var host = new Host("freedom");  
    var cat = new cat("Lucy"); 
    cat.addCatHost(host); 
    host = null ;  
    alert(cat.getCatHost().name)  
</script> <span></span>

结果:弹出“freedom”






【JavaScript】JavaScript 垃圾回收机制深度解析:内存管理的艺术 在这个信息爆炸的时代,每一行代码都可能成为数字海洋中的璀璨星光,亦或是悄然累积的暗流。JavaScript,作为互联网世界的通用语言,它的每一次呼吸——数据的创建与消亡,都离不开垃圾回收机制的精密调控。在这篇文章中,我们将携手踏上一场深入JavaScript内存管理腹地的探险之旅,揭开垃圾回收机制那既神秘又强大的面纱,让每一次内存的分配与回收,都能成为推动应用高效运转的强劲动力。 阅读详情

相关推荐

深入分析 Node.js 的 V8 引擎如何在内部处理 JavaScript 代码,包括内存管理和垃圾回收机制。

今天咱们就来聊聊 Node.js 的大心脏——V8 引擎,看看它到底是怎么把咱们写的 JavaScript 代码给“消化”掉的。V8 的内存管理就像一个精明的“后勤部长”,负责给 JavaScript 代码分配内存,并且在内存不够用的时候,把没用的内存回收回来。好了,今天的讲座就到这里。掌握了 V8 的这些“内功心法”,你就能写出更高效的 JavaScript 代码,让你的 Node.js 应用跑得更快!垃圾回收就像一个勤劳的“清洁工”,定期清理堆里的垃圾,把没用的对象回收掉,腾出空间给新的对象。

weixin_41455464的博客 599

JavaScript中的内存回收机制

在js中,垃圾回收器每隔一段时间就会找出那些不再使用的数据,并释放其所占用的内存空间。 以全局变量和局部变量来说,函数中的局部变量在函数执行结束后这些变量已经不再被需要,所以垃圾回收器会识别并释放它们。 而对于全局变量,垃圾回收器很难判断这些变量什么时候才不被需要,所以尽量少使用全局变量。...

yigetutouzai的博客 2388

js系列四:内存回收机制

一、垃圾回收的必要性   下面这段话引自《JavaScript权威指南(第四版)》   由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存...

人生代码 ---- 公众号 4283

你真的了解JS垃圾回收机制吗?

垃圾回收是JavaScript中内存管理的重要组成部分。开发人员不需要手动分配和释放内存。垃圾回收机制可以自动处理内存的分配和释放,减轻了开发人员的负担,并且降低了内存泄漏的风险,它的主要目的是自动地检测和释放不再使用的内存,以便程序能够更高效地利用系统资源。 它通过标记不再需要的对象,并回收它们所占用的内存空间,以便其他对象可以使用。 本篇文章将与大家分享,介绍一下JavaScript垃圾回收的重要性和定义,并深入探讨内存管理的概念、JS垃圾回收机制的分类,以及如何避免内存泄漏以及性能优化。

00后|互联网💻|办公室🍵茶农,希望通过技术改变生活|爱折腾💪|收集各类📚网络资源,好物不私藏,点点关注,不迷路。 全网搜:阿宇的编程之旅 or 阿宇的宝库 2148

Vertx之Grpc消息发送

介绍 Vert.x gRPC 模块,它将 Google gRPC 的编程风格与 Vert.x 风格保持一致. gRPC 是一个高性能、开源、通用的RPC框架,是一种进程间通讯技术,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来就像调用本地程序一样,轻松的实现远端服务的连接、

Lance 1188

Innovus时钟树综合CTS实战:从原理到signoff的完整指南

时钟树综合(CTS)是数字后端实现中保障同步电路时序收敛的核心环节,其本质是在物理层面构建低偏斜、可控延迟的全局时钟分发网络。它基于静态时序分析(STA)原理,通过平衡clock skew、insertion delay、transition time与功耗面积等多维约束,对抗工艺电压温度(PVT)变异带来的时序不确定性。技术价值在于支撑GHz级高频芯片的setup/hold签核,广泛应用于CPU、GPU、AI加速器等复杂SoC的Innovus后端流程。本文聚焦CTS在Innovus工具链中的工程落地,覆盖

weixin_28523493的博客 224

JavaScript 内存(垃圾)回收机制

本文描述了JavaScript内存(垃圾)回收机制的两种方式、如何避免内存泄露的各种情况,并对计算机的内存机制进行了适当的补充。

Jackson_Mseven的博客 688

MobaXterm隧道配置详解:为PyCharm远程开发打通‘最后一公里’

本文详细解析了如何利用MobaXterm配置SSH隧道,实现PyCharm远程开发的高效连接。通过本地端口转发技术,开发者可以安全访问内网服务器,特别适用于需要通过跳板机的复杂网络环境。文章涵盖从基础配置到企业级运维的全套解决方案,包括性能优化、安全加固等实用技巧。

weixin_30566063的博客 503

js的垃圾回收机制+常见的内存泄漏+闭包详解+执行上下文

js的垃圾回收机制+常见的内存泄漏+闭包详解+执行上下文

m0_52669454的博客 1571

AI应用架构师:引领半导体良率AI预测的变革浪潮

在半导体行业这个技术密集、资本密集且竞争异常激烈的领域,良率是决定企业盈利能力的关键指标。每提升1%的良率可能意味着数亿美元的利润增长。然而,随着制程节点不断缩小至3nm、2nm甚至更先进水平,传统的良率管理方法已难以应对日益复杂的制造流程和指数级增长的数据量。本文将深入探讨AI应用架构师如何成为这场变革的核心驱动力,通过设计和实施先进的AI预测系统,将半导体良率预测从传统的"事后分析"转变为"事前预测"和"实时优化"。

AI大模型应用之禅 403

Unity资源逆向解析:从APK到AssetStudio的完整实战

本文详细介绍了Unity资源逆向解析的全流程,从APK解包到使用AssetStudio深度解析Unity游戏资源。通过实战案例演示如何提取《植物大战僵尸》等游戏的素材,包括贴图、音频和3D模型,帮助开发者掌握Unity游戏逆向工程的核心技术。

weixin_30664051的博客 475

JavaScript 垃圾回收机制

js中的分配和回收都是的,内存在不使用的时候就会被自动回收。

weixin_37133641的博客 798

无人机芯片模块技术要点分析

恶劣环境下信号稳定性:无人机在恶劣环境下工作时,遥感系统采集的信号往往很不稳定,视频信号处理芯片需要具备强抗干扰能力,能辨别脉冲脉宽为50ns以上、幅度为0V~4.5V的输入信号。这种架构能兼顾强大的运算能力和灵活的接口控制。芯片小型化:麻省理工学院的研究人员已设计出仅20平方毫米的微型芯片,可处理无人机飞行所需的惯性数据和相机图像,为微型无人机的发展奠定了基础。光子集成芯片(PIC) :研究显示,与电子芯片相比,光子计算芯片在延迟、计算容量和能效上都有数量级的提升,有望解决当前无人机系统的计算瓶颈。

YUNZHUO666的博客 1404

JS内存泄漏和垃圾回收机制

程序设计之道无远弗届,御晨风而返。———— 杰佛瑞 · 詹姆士 JS内存泄漏看字面意思是内存泄漏出去,其实不然,内存泄漏是指一块空间使用完没有被销毁一直占用空间,这就是内存泄漏。 常见内存泄漏原因 全局变量引起的内存泄漏。 闭包引起的内存泄漏。 遗忘的DOM引用 垃圾回收机制 通常分为两种方式: 1. 标记清除。 2. 引用计数。 第一种是当变量进入到内存当中...

一入前端深似海 1421

python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法

出现该Bug的原因主要是 账号密码无法登录,但原先使用该代码测试qq或者163的时候是可以通过的!问题在于各个公司邮件所处理的代码方式不一样

码农研究僧的博客 3503

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

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

JavaScript 的内存管理与垃圾回收机制详解

JavaScript 的内存管理和垃圾回收机制让开发者无需手动管理内存,但了解其工作原理对于编写高效、可靠的代码至关重要。通过优化内存分配、避免内存泄漏以及正确使用工具,我们可以大幅提升应用性能并降低内存使用风险。

weixin_71329368的博客 793

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【js基础】js的垃圾回收机制/内存回收机制

代码】【js基础】js的垃圾回收机制/内存回收机制。

在热爱技术的路上一直前行。 889

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

js内存回收机制

js数据类型分类: 1.基本类型:string、number、boolean、null、undefined、symbol 2.引用类型:对象 object、array、function、reg、data、set

hkduan的博客 573

js垃圾回收机制和内存泄漏

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。我特地针对初学者整理一套前端学习资料分享给大家,戳这里即可领取道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

2401_84091663的博客 590

JavaScript 中垃圾回收机制的工作原理,如何优化以减少内存占用?

在 JavaScript 里,垃圾回收机制就像是一个勤劳的清洁工,专门负责打扫那些不再使用的内存空间,确保程序运行得又快又稳。咱们先来讲讲它是怎么工作的。WeakMap 和 WeakSet 就像是健忘的容器,它们对对象的引用是弱引用,当对象没有其他强引用时,垃圾回收机制可以直接清理掉这些对象。这是 JavaScript 中最常用的垃圾回收算法,就好比在一个房间里,标记出那些不再需要的东西,然后统一清理掉。通过以上这些方法,可以在项目实际开发中合理应用垃圾回收机制,有效减少内存占用,提高程序的性能和稳定性。

前端大白话 874

javascript的垃圾回收机制与内存管理

一、垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。 JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定...

h1234561234561的博客 304

JS内存泄漏与垃圾回收机制

转载地址 http://www.ruanyifeng.com/blog/2017/04/memory-leak.html https://blog.youkuaiyun.com/oliver_web/article/details/53957021 https://www.cnblogs.com/zhwl/p/4664604.html 什么是内存泄漏? 程序的运行需要内存,只要程序提出要求,操作系统...

博客 2万+

JavaScript内存回收机制

摘要:本文介绍了JavaScript的内存回收机制,包括内存溢出的常见问题及自动垃圾回收机制的工作原理。JS采用分代回收策略,将内存分为新生代(频繁回收的小数据)和老生代(大数据)。新生代通过空间复制实现回收,老生代则采用标记清除与内存整理。虽然引擎自动管理内存,开发者仍需注意及时释放不再使用的数据(如定时器、闭包等),避免内存泄漏。了解垃圾回收机制对编写高性能代码具有重要意义。

Zhencode的博客 202

关于js内存回收机制

参考: http://blog.chinaunix.net/uid-26672038-id-3522560.html js的内存回收是有回收器自动回收的,不想c++那样,由开发者自己处理 function test1() {   var i = {name: 'sss'} } function test2() {   var i = {name: 'ss'};   return i; } var

weiyangxiaoping的博客 387

JavaScript内存泄露和垃圾回收机制

JavaScript内存泄露、垃圾回收机制

smell201611010513的博客 939
上一篇: 不知名大牛二十六个月Android学习工作总结(整理)
下一篇: javascript运算符
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值