js的棧堆與淺拷貝、深拷貝的理解

一:什么是堆棧?

??我們都知道:在計算機領域中,堆棧是兩種數據結構,它們只能在一端(稱為棧頂(top))對數據項進行插入和刪除。

  • 堆:隊列優先,先進先出;由操作系統自動分配釋放?,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
  • 棧:先進后出;動態分配的空間?一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。?
    以上都屬于計算機基礎部分,在此都不詳細贅述了,下面我們聯系JavaScript來剖析一下堆棧。
  • 棧堆之間的關系,在棧中存放的基本類型數據如果包含了應用類型(heap),那么棧中存放的只是堆中的一個地址,根據這個地址系統可以找到數據在堆中的位置。

二:JavaScript中的基本類型和引用類型與堆棧有什么聯系?

JavaScript的數據類型分為兩大種:?
1.?基本類型:Undefined、Null、Boolean、Number 和 String,這5中基本數據類型可以直接訪問,他們是按照值進行分配的,存放在棧(stack)內存中的簡單數據段,數據大小確定,內存空間大小可以分配。?
2.?引用類型:即存放在堆(heap)內存中的對象,變量實際保存的是一個指針,這個指針指向另一個位置。?
??以上我們知道了什么是堆棧,和JavaScript的數據類型,下面我們根據js的數據類型來說明一下他們的拷貝情況:

結合下面的例子理解堆棧的關系:

	var xm = {age: 18,score: 4};var xh = {age: 18,score: 4};console.log(xm===xh);   //falsevar  newobj=xhconsole.log(newobj===xh);   //true//下面這也是一個你叫經典的例子可以試一下function setName(obj) {obj.name = 'xm';  //在傳參數中新建內存對象,并且設定一個值obj = {};          //對象是引用類型。系統在堆中新建一個內存空間,與傳入值無關。obj.name = 'xh';   //在新建的內存空間設置一個值(與傳入值是獨立開來的。)}var person = {};setName(person);console.log(person.name);   // xm
//console.log([] instanceof Array);
// console.log(typeof []);

xm和xh的對象值是一樣的,可是在關系比較重為false,當新建對象賦值是這種情況就是true.下圖給大家講解。

這就會出現另外一種情況,我們想去判斷引用類型的值是否相等,(下面以對象為例子進行講解。)

	var xm = {age: 18,score: 4};var xh = {age: 18,score: 4};
function equalObjs(a, b) {for (var p in a) {if (a[p] !== b[p]) return false;}return true;}

三:什么是淺拷貝?

? ?基本類型拷貝的時候只是在內存中又開辟了新的空間,是的新建的值與拷貝值相互獨立。(可以理解為在堆中新建一個空間存放同樣的值。)這個方法可以利用上面判斷相等的辦法遍歷出堆(heap)值重新賦值。因此深淺拷貝是相對于引用類型的。

	var xm = {age: 18,score: 4,arr1:[1,32]};function copyObj(obj) {var newObj = {};for (var p in obj) {newObj[p] = obj[p];}return newObj;}var xh = copyObj(xm);// var arr1=[1,2,3]xh.arr1.push(33)console.log(xh)  //{age: 18, score: 4, arr1: Array(3)}console.log(xh===xm); //falseconsole.log(xh.arr1===xm.arr1);  //true 

console.log(xh.arr1===xm.arr1); ?//true 這里出現了一個問題,淺拷貝中遍歷對象里面包含了另外一個應用類型(arr1),而它的空間是獨立的,這樣直接被引用。

如果想實現兩個值的完全獨立,這時就需要使用到深拷貝。

四:深度拷貝

? ? ? 根據淺拷貝出現的問題,我們可以使用深拷貝的方法解決問題。

? ? ? 深拷貝的方法比較多,我舉一些比較簡單的例子來說明一下。

最簡單的辦法:JSON.parse(obj)

	var xm = {age: 18,score: 4,arr1:[1,32]};var xh=JSON.parse(JSON.stringify(xm))xh.arr1.push(33)console.log(xh)  //{age: 18, score: 4, arr1: Array(3)}console.log(xh===xm); //falseconsole.log(xh.arr1===xm.arr1);  //false

其他的方法需要使用遞歸操作來進行。

轉載于:https://www.cnblogs.com/qiuxiaojian/p/9415721.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279694.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279694.shtml

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

相關文章

python面向對象基礎語言進階

在此感謝前輩們的指導:http://python.jobbole.com/80955/ https://www.cnblogs.com/wupeiqi/p/4766801.htmlhttps://www.cnblogs.com/paomaliuju/p/5122761.html https://www.cnblogs.com/goser/articles/7097728.html http://www.cnblogs.com/alex3714/articles/52…

ea 備份碼是什么_EA的原始訪問是什么,值得嗎?

ea 備份碼是什么EA’s Origin Access gives you access to more than 70 games, discounts, and new EA games before they’re released for a monthly (or yearly) subscription fee. But is it really worth it? EA的Origin Access可讓您訪問70多種游戲,打折游戲…

Https 加密原理分析

眾所周知,HTTP 協議通過明文傳輸,是不安全的。于是,就在 HTTP 協議的基礎上,進行了數據加密,也就誕生了 HTTPS 協議。注意,HTTPS 并不是一個新的協議,它只不過是在 HTTP 的基礎上加了一層 TLS (…

JS框架_(JQuery.js)純css3進度條動畫

百度云盤  傳送門  密碼&#xff1a;wirc 進度條動畫效果&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1">…

如何在Android主屏幕上添加熱點快捷方式

Portable Wi-Fi hotspots on your Android phone are great, because hotel Wi-Fi usually isn’t, but toggling that hotspot on and off is a pain. Here are several easy ways to add a hotspot widget to your home screen. 您的Android手機上的便攜式Wi-Fi熱點很棒&…

提高關鍵詞排名的28個SEO技巧

28個讓關鍵詞排名明顯改觀的SEO技巧&#xff1a; 關鍵詞位置、密度、處理 URL中出現關鍵詞&#xff08;英文&#xff09; 網頁標題中出現關鍵詞&#xff08;1-3個&#xff09; 關鍵詞標簽中出現關鍵詞&#xff08;1-3個&#xff09; 描述標簽中出現關鍵詞&#xff08;主關鍵…

SQLI DUMB SERIES-16

&#xff08;1&#xff09;無論怎么輸入&#xff0c;都沒有回顯&#xff0c;但當輸入 admin")#時&#xff0c;顯示登錄成功。若通過其他方法獲取數據庫的用戶名&#xff0c;可通過這個方法登錄成功。 &#xff08;2&#xff09;獲取其他信息可用考慮時間延遲注入。方法同1…

如何在YouTube視頻上禁用注釋

YouTube has that betcha-can’t-watch-just-one appeal to it, which is why YouTube’s annoyances become so pronounced the more you use it. Many of these features, such as annotations can be permanently disabled, making for a more enjoyable viewing experience…

Linux目錄配置及應放置的內容

Linux目錄配置及應放置的內容 /bin&#xff1a;系統有很多放置執行文件的目錄&#xff0c;但/bin比較特殊。因為/bin放置的是在用戶維護模式下還能夠被操作的命令。在/bin下面的命令可以被root與一般賬號所使用&#xff0c;主要有cat,chmod,chown,date,mv,mkdir,cp,bash等常用命…

快速實現一個Http回調組件

2019獨角獸企業重金招聘Python工程師標準>>> 快速實現一個Http回調組件 一、前情回顧 ? 我們平時在使用一些庫的時候&#xff0c;會遇到一些看起來很舒服的寫法&#xff0c;用起來感覺很簡單&#xff0c;而且寫法也很優雅&#xff0c;比如OkHttp&#xff0c;或者是…

MyBatis緩存通俗易懂

1.1 mybatis緩存介紹 如下圖&#xff0c;是mybatis一級緩存和二級緩存的區別圖解&#xff1a; Mybatis一級緩存的作用域是同一個SqlSession&#xff0c;在同一個sqlSession中兩次執行相同的sql語句&#xff0c;第一次執行完畢會將數據庫中查詢的數據寫到緩存&#xff08;內…

DVbbs8.2入侵思路與總結

dvbbs8.2后比較變態&#xff0c;目前還沒有特別好的方法&#xff0c;外面有人提到一種方法就是直接上傳php文件或者其它服務器支持文件&#xff0c;這個也是一個思路&#xff0c;不過很多時候&#xff0c;單獨的服務器不會支持這么多。dvbbs禁用了asp和asp.net的上傳&#xff0…

Python基礎教程:Python pass語句詳解

2019獨角獸企業重金招聘Python工程師標準>>> Python pass 語句 Python pass是空語句&#xff0c;是為了保持程序結構的完整性。 pass 不做任何事情&#xff0c;一般用做占位語句。 Python 語言 pass 語句語法格式如下&#xff1a; 實例&#xff1a; 學習從來不是一個…

Oracle數據庫在Nokia

Nokia固然今非昔比&#xff0c;但在手機市場仍是未瘦死的駱駝&#xff0c;有關報道顯示Nokia現役的數據庫(包括Oracle、MySQL、MSSQL)達到2300套之多&#xff0c; DBA團隊共有20多人&#xff0c;平均每人100多套庫。 Grid Control在過去5年中是最主要的、也幾乎是唯一的DBA管理…

css animation動畫

css 動畫&#xff1a; 動畫是CSS3中具有顛覆性的特征之一&#xff0c;可通過設置多個節點來精確控制一個或一組動畫&#xff0c;常用來實現復雜的動畫效果. 必要元素&#xff1a;a、通過keyframes指定動畫序列&#xff1b;自動補間動畫&#xff0c;確定兩個點&#xff0c;系統會…

甘特圖看起來很生硬?教你使用智能顏色裝飾你的甘特圖!(二)

在上一篇文章中我們了解到顏色在甘特圖中也有不同的作用。其中顏色在甘特圖中扮演著三個角色&#xff0c;才能使甘特圖對用戶有意義。 顏色決定甘特圖的外觀。顏色還可以用來定義甘特圖的語義。因此&#xff0c;它們幫助用戶更快地理解甘特圖所呈現的完整且常常復雜的現實。顏色…

網絡串流_串流NFL足球的最便宜方式(無需電纜)

網絡串流Football season is almost upon us. That means one thing: expensive cable or satellite TV packages. Okay, it also means beer commercials and overpriced stadium tickets and quarterbacks trying to sell you car insurance. But in terms of immediate cost…

【高清】網絡安全思維導圖

本文轉自 是阿杰啊 51CTO博客&#xff0c;原文鏈接:http://blog.51cto.com/jschinamobile/1969018

生成函數初探

對給定序列\(\{a_{0,1,2,\cdots}\}\) 構造一個函數\(F(x)\sum_{i0,1,2,\cdots}a_if_i(x)\)&#xff0c;稱\(F(x)\)為序列\(\{a_{0,1,2,\cdots}\}\)的生成函數。其中&#xff0c;序列\(\{f_{0,1,2,\cdots}(x)\}?\)只作為標志用&#xff0c;稱為標志函數。 普通型生成函數(OGF) …

Pixel相機是怎么做到自動補抓最不錯的自拍照

網絡大廠 AI研究團隊近日在最新的Pixel相機中&#xff0c;于無快門模式Photobooth新增親吻偵測功能&#xff0c;當用戶親吻自己的愛人時&#xff0c;相機會自動捕捉這一瞬間。網絡大廠過去是藉由Photobooth模式&#xff0c;讓用戶更簡單地成功自拍&#xff0c;不管是一個人、情…