JavaScript-内存空间

深入了解js这门语言后,才发现它有着诸多众所周知的难点(例如:闭包、原型链、内存空间等)。有的是因为js的设计缺陷导致的,而有的则是js的优点。不管如何,总需要去学会它们,在学习过程中我觉得只看别人的文章并不能做到深刻理解,所以我决定写这一系列的文章来记录我所学习到的知识点,也方便自己以后回顾,如有写错的地方欢迎指正。 
废话不多说,马上进入正题!

一、基本数据类型和引用类型

JS中有五种基本数据类型:Undefined、Null、Boolean、Number和String。这些基本数据类型是存储在栈内存空间内的,我们可以直接操作栈内存中的值,称之为按值访问。这个栈内存类似于数据结构中的栈,也是遵循后进先出的原则。 
除了基本数据类型,JS还有引用类型。引用类型的值是保存在内存中的对象,JS不能直接操作对象的内存空间,也就是说我们在操作对象时操作的是对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。 
两者之间的存储方式不同导致了复制时会产生不同的影响。 
基本数据类型 
如上图,把num1的值赋值给num2后,num1和num2的值是相互独立互不影响的。而当从一个变量向另一个变量复制引用类型的值时,复制的值实际上是一个指针。复制结束后两个变量的指针将引用存储在堆内存中的同一个对象。因此改变其中一个变量会影响到另一个变量。 
这里写图片描述

二、内存空间管理

JS具有自动垃圾收集机制,垃圾收集器会按照一定的时间间隔周期性地执行回收内存的操作。

而JS的内存生命周期分为三个周期:

1.分配需要的内存 
2.使用分配到的内存进行操作 
3.使用完毕后被回收

用一个变量num的创建销毁来举例子

var num = 20; // 给变量num分配内存空间
console.log(num + 1); // 使用num变量
num = null; // 使用后释放内存空间
  • 1
  • 2
  • 3

JS最常用的垃圾收集方式是标记清除(mark-and-sweep)。当局部变量的环境执行完毕后,局部变量就离开了其执行环境,这时它就会被自动地打上标记,等到下个垃圾收集操作时间到来时垃圾收集器就会回收变量占用的内存空间。对于全局变量,我们也可以像上例所示把null赋值给num,这样num就被手动地打上标记而被垃圾收集器回收。

三、内存泄露

所谓内存泄露就是指一些错误的使用导致其占用的内存空间即使不再使用也无法被正常回收。常见的内存泄露有四种: 
1.多余的全局变量

function func() {num = 1;console.log(num);
}
func();
//如果没有手动释放,num在函数调用完后仍然存在,导致了内存泄露。
// num = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.遗忘的定时器

function func() {var timer = setInterval(function(){console.log("123");},1000);
}
func();
func = null;
// 即使释放了func的内存空间,定时器也会继续执行。必须手动释放定时器
// clearInterval(timer);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.没有清理的DOM引用

var elements = {button: document.getElementById("button")
};
document.body.removeChild(document.getElementById("button"));
//尽管我们移除了button元素,但elements对象里还保存着#button的引用。所以button元素所占用的内存空间不会被垃圾收集器回收。
  • 1
  • 2
  • 3
  • 4
  • 5

4.闭包

var leaks = function(){  var leak = 'xxxxxx'; // 被闭包所引用,不会被回收return function(){console.log(leak);}
};
leaks();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java类的结构1: 属性 —(11)

类的设计中,两个重要结构之一:属性 对比:属性 vs 局部变量 1.相同点: 1.1 定义变量的格式:数据类型 变量名 变量值1.2 先声明,后使用1.3 变量都其对应的作用域 2.不同点: 2.1 在类中声明的…

javascript-排序算法

插入排序 算法描述: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 4. 重复步骤 3&am…

DPDK并行计算

参考文献: 《深入浅出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言: 处理器提高性能主要是通过两个途径,一个是提高IPC(CPU每一时…

Highcharts图表-ajax-获取json数据生成图表

重点说明此代码是针对一个报表显示多个项对比显示。 直接贴代码&#xff1a;web端 <script type"text/JavaScript" src"js/jQuery/jquery-1.7.2.js"></script> <script type"text/javascript" src"j…

Java—List的用法与实例详解

List特点和常用方法 List是有序、可重复的容器。 有序指的是&#xff1a;List中每个元素都有索引标记。可以根据元素的索引标记&#xff08;在List中的位置&#xff09;访问元素&#xff0c;从而精确控制这些元素。 可重复指的是&#xff1a;List允许加入重复的元素。更确切地讲…

Java—遍历集合的N种方式总结Collections工具类

遍历集合的N种方式总结 【示例1】遍历List方法1&#xff0c;使用普通for循环 for(int i0;i<list.size();i){ //list为集合的对象名 String temp (String)list.get(i); System.out.println(temp); } 【示例2】遍历List方法2&#xff0c;使用增强for循环(使用泛型定义…

java类的结构2: 方法—(12)

面向对象的特征一&#xff1a;封装与隐藏 1.为什么要引入封装性&#xff1f; 我们程序设计追求“高内聚&#xff0c;低耦合”。 高内聚 &#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合 &#xff1a;仅对外暴露少量的方法用于使用。…

List接口常用实现类的特点和底层实现

List接口常用的实现类有3个&#xff1a;ArrayList、LinkedList、Vector。 那么它们的特点和底层实现有哪些呢&#xff1f; ArrayList特点和底层实现 ArrayList底层是用数组实现的存储。 特点&#xff1a;查询效率高&#xff0c;增删效率低&#xff0c;线程不安全。我们一般使用…

java面向对象的特征 —(13)

面向对象的特征一&#xff1a;封装与隐藏 1.为什么要引入封装性&#xff1f; 我们程序设计追求“高内聚&#xff0c;低耦合”。 高内聚 &#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合 &#xff1a;仅对外暴露少量的方法用于使用。…

jquery Ajax请求本地json

1-1-1 json文件内容(item.json) [{"name":"张国立","sex":"男","email":"zhangguoli123.com","url":"./img/1.jpg"},{"name":"张铁林","sex":"男"…

论文《learning to link with wikipedia》

learning to link with wikipedia 一、本文目标&#xff1a; 如何自动识别非结构化文本中提到的主题&#xff0c;并将其链接到适当的Wikipedia文章中进行解释。 二、主要借鉴论文&#xff1a; Mihalcea and Csomai----Wikify!: linking documents to encyclopedic knowledge 第…

java面向对象的特征二:继承性 —(14)

1.为什么要有类的继承性&#xff1f;(继承性的好处&#xff09; ① 减少了代码的冗余&#xff0c;提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用&#xff0c;提供了前提 图示&#xff1a; 2.继承性的格式&#xff1a; class A extends B{} A:子类、派生类、s…

java面向对象的特征三:多态性 —(15)

1.多态性的理解&#xff1a;可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 举例&#xff1a; Person p new Man(); Object obj new Date(); 3.多态性的…

vue 中$index $key 已移除

之前可以这样: 123456<ulid"example"><liv-for"item in items">{{$index}}{{$key}}</li></ul>现在已经移除,如果还用的话就会报错:Uncaught ReferenceError: $index is not defined; 现在这样写: 123456<ul id"example&qu…

vue-resource全攻略

Vue.js——vue-resource全攻略 概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用&#xff0c;并实现了一个简单的跨域CURD示例。Vue.js是数据驱动的&#xff0c;这使得我们并不需要直接操作DOM&#xff0c;如果我们不需要使用jQuery的DOM选择器&#xff0c;就没有必要…

java面向对象:关键字 —(16)

static:静态的 1.可以用来修饰的结构&#xff1a;主要用来修饰类的内部结构 属性、方法、代码块、内部类 2.static修饰属性&#xff1a;静态变量&#xff08;或类变量&#xff09; 2.1 属性&#xff0c;是否使用static修饰&#xff0c;又分为&#xff1a;静态属性 vs 非静态…

《少年先疯队》第九次团队作业:Beta冲刺与团队项目验收

博文简要信息表&#xff1a; 项目内容软件工程https://www.cnblogs.com/nwnu-daizh/本次实验链接地址https://www.cnblogs.com/nwnu-daizh/p/11056511.html团队名称少年先疯队作业学习目标&#xff08;1&#xff09;掌握软件黑盒测试技术&#xff1b;&#xff08;2&#xff09;…

vue-resource jsonp跨域问题解决方法

最近在学习vue.js 碰到个ajax跨域请求的问题&#xff0c;之前知道可以用jsonp解决&#xff0c;但是一直没实践过&#xff0c;这次用发现里面好多问题&#xff0c;所以现在记录下来&#xff0c;希望可以给刚接触使用jsonp的同学一点帮助&#xff01; 关于什么是jsonp&#xff0c…

java面向对象:关键字 —(17)

interface:接口 1.使用说明&#xff1a; 1.接口使用interface来定义 2.Java中&#xff0c;接口和类是并列的两个结构3.如何定义接口&#xff1a;定义接口中的成员 3.1 JDK7及以前&#xff1a;只能定义全局常量和抽象方法>全局常量&#xff1a;public static final的.但是…

java面向对象:异常处理 —(18)

1. 异常的体系结构 java.lang.Throwable |-----java.lang.Error:一般不编写针对性的代码进行处理。|-----java.lang.Exception:可以进行异常的处理|------编译时异常(checked)|-----IOException|-----FileNotFoundException|-----ClassNotFoundException|------运行时异常(un…