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.pswp.cn/news/247729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247729.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java類的結構1: 屬性 —(11)

類的設計中,兩個重要結構之一:屬性 對比:屬性 vs 局部變量 1.相同點: 1.1 定義變量的格式:數據類型 變量名 變量值1.2 先聲明,后使用1.3 變量都其對應的作用域 2.不同點: 2.1 在類中聲明的…

GXU - 7D - 區間求和 - 前綴和

https://oj.gxu.edu.cn/contest/7/problem/D 描述 有一個所有元素皆為0的數組A,有兩種操作: 1 l r x表示將A區間[l,r]內所有數加上x; 2 l r表示將A區間[l,r]內從左往右數第i個數加上i; 給出m個操作,請輸出操作結束后A中…

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…

關于RGBDSLAMV2學習、安裝、調試過程

Step&#xff11;&#xff1a;https://github.com/felixendres/rgbdslam_v2/wiki/Instructions-for-Compiling-Rgbdslam-(V2)-on-a-Fresh-Ubuntu-16.04-Install-(Ros-Kinetic)-in-Virtualbox 照著這個instructions安裝好 rgbdslamv2&#xff0c;并且在安裝的過程中&#xff0c;…

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;僅對外暴露少量的方法用于使用。…

Docker 環境下部署 redash

環境&#xff1a; centos7 官網&#xff1a;https://redash.io/help/open-source/dev-guide/docker 一、安裝步驟 1、虛擬機安裝 安裝vmware&#xff0c;并安裝centos7 2、安裝docker docker安裝手冊 3、安裝nodejs centos下安裝Nodejs 4、redash安裝 1)、clone git repostory …

List接口常用實現類的特點和底層實現

List接口常用的實現類有3個&#xff1a;ArrayList、LinkedList、Vector。 那么它們的特點和底層實現有哪些呢&#xff1f; ArrayList特點和底層實現 ArrayList底層是用數組實現的存儲。 特點&#xff1a;查詢效率高&#xff0c;增刪效率低&#xff0c;線程不安全。我們一般使用…

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

面向對象的特征一&#xff1a;封裝與隱藏 1.為什么要引入封裝性&#xff1f; 我們程序設計追求“高內聚&#xff0c;低耦合”。 高內聚 &#xff1a;類的內部數據操作細節自己完成&#xff0c;不允許外部干涉&#xff1b; 低耦合 &#xff1a;僅對外暴露少量的方法用于使用。…

null指針

做了一個關于花卉花木的管理操作&#xff0c;后期因為花卉的類型需要顯示在花卉詳情頁面&#xff0c;所以需要兩張表連接。在不寫sql語句的前提下&#xff0c;用了外鍵連接。因為在先前的操作過程中&#xff0c;沒有將外鍵所在字段設置為必填項&#xff0c;導致有一個外鍵字段為…

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類的結構:構造器 —(13)

1.構造器&#xff08;或構造方法&#xff09;&#xff1a;Constructor 構造器的作用&#xff1a; 1.創建對象2.初始化對象的信息 2.使用說明&#xff1a; 1.如果沒顯式的定義類的構造器的話&#xff0c;則系統默認提供一個空參的構造器2.定義構造器的格式&#xff1a;權限修…

java面向對象的特征二:繼承性 —(14)

1.為什么要有類的繼承性&#xff1f;(繼承性的好處&#xff09; ① 減少了代碼的冗余&#xff0c;提高了代碼的復用性② 便于功能的擴展③ 為之后多態性的使用&#xff0c;提供了前提 圖示&#xff1a; 2.繼承性的格式&#xff1a; class A extends B{} A:子類、派生類、s…

vuejs怎么在服務器上發布部署

首先VUE 是一個javascript的前端框架&#xff0c;注定了它是運行在瀏覽器里的&#xff0c;對服務器本地沒有任何要求&#xff0c;只要一個靜態文件服務器能通過http訪問到其資源文件就足矣&#xff01;無論你是用apache ,ngnix 就算你要用node 自己實現一個靜態文件服務器&…

C#入門詳解(14)

接口&#xff0c;依賴反轉&#xff0c;單元測試 接口是協約是規定&#xff0c;所以必須是公開的&#xff0c;只能是public; static void Main(string[] args){int[] num1 new int[] { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(num1).ToString());Console.WriteLine(""…

SpringBoot操作MongoDB實現增刪改查

本篇博客主講如何使用SpringBoot操作MongoDB。 SpringBoot操作MongoDB實現增刪改查 &#xff08;1&#xff09;pom.xml引入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifac…