国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript對(duì)內(nèi)存的使用

Eastboat / 2814人閱讀

摘要:內(nèi)存圖示意圖內(nèi)存圖就是簡(jiǎn)化模擬示意使用的內(nèi)存中的數(shù)據(jù)區(qū)中的情況,簡(jiǎn)單的分為棧內(nèi)存堆內(nèi)存,如下圖。明顯,左邊是原始代碼,中間是棧內(nèi)存,右邊是堆內(nèi)存。如果原始代碼中變量是對(duì)象,棧內(nèi)存中就會(huì)存儲(chǔ)堆內(nèi)存的地址隨機(jī),堆內(nèi)存中會(huì)存儲(chǔ)這個(gè)對(duì)象的所有內(nèi)容。

內(nèi)存的分配(示意)

啟動(dòng)程序,就需要分配內(nèi)存給運(yùn)行的程序。啟動(dòng)瀏覽器,就會(huì)分配一定內(nèi)存供瀏覽器使用,瀏覽器在會(huì)分配相應(yīng)的內(nèi)存供諸如HTML+CSS,JS,"HTTP","其他插件、定時(shí)器`等模塊使用,如下圖。

會(huì)有一部分內(nèi)存供JS模塊使用,JS一般會(huì)將JS代碼存儲(chǔ)在代碼區(qū),數(shù)據(jù)區(qū)內(nèi),通過(guò)某種聯(lián)系將代碼和數(shù)據(jù)對(duì)應(yīng)在一起,如下圖。

內(nèi)存圖 示意圖

內(nèi)存圖就是簡(jiǎn)化模擬示意JS使用的內(nèi)存中的數(shù)據(jù)區(qū)中的情況,簡(jiǎn)單的分為棧內(nèi)存Stack,堆內(nèi)存Heap,如下圖。明顯,左邊是原始代碼,中間是棧內(nèi)存,右邊是堆內(nèi)存

使用

左邊原始代碼定義一個(gè)變量,在棧內(nèi)存中就會(huì)用64位存儲(chǔ)一個(gè)值。如果原始代碼中變量是非對(duì)象棧內(nèi)存中這個(gè)值就是直接值堆內(nèi)存沒(méi)有數(shù)據(jù)。如果原始代碼中變量是對(duì)象棧內(nèi)存中就會(huì)存儲(chǔ)堆內(nèi)存的地址(隨機(jī)),堆內(nèi)存中會(huì)存儲(chǔ)這個(gè)對(duì)象的所有內(nèi)容

看到上個(gè)圖,原始代碼區(qū)里最后一行O2=O,將一個(gè)對(duì)象賦值給另一個(gè)變量時(shí),實(shí)際上是將堆內(nèi)存的地址賦值給另一個(gè)變量,轉(zhuǎn)換如下圖,O2在棧內(nèi)存中的內(nèi)容就變成了和O一樣的堆內(nèi)存地址

應(yīng)用實(shí)例 第一個(gè)

原始代碼中定義變量a=1,Stack中存儲(chǔ)1

原始代碼中定義變量b=a,Stack中存儲(chǔ)b的值和a一樣,為1

原始代碼中賦值b=2,都是非對(duì)象,Stack中直接將b的值改為2,不影響a

全程非對(duì)象,所以沒(méi)有涉及堆內(nèi)存Heap

第二個(gè)

原始代碼中定義變量a={name:"a"},是個(gè)對(duì)象,隨機(jī)分配Heap地址(比如:31)并在Heap中存儲(chǔ)這個(gè)對(duì)象,在Stack中存儲(chǔ)這個(gè)Heap地址,比如ADDR 31

原始代碼中定義變量b=a,是個(gè)存在的對(duì)象,將a的Stack值(ADDR 31)(Heap地址)賦給b的Stack值

原始代碼中賦值b=null,賦給了b一個(gè)非對(duì)象,將b的Stack值改為null,不影響a

全程操作Stack值,對(duì)象的Stack值為Heap地址

第三個(gè)

原始代碼定義變量a={n:1},隨機(jī)分配Heap地址(比如:34)并在Heap中存儲(chǔ)這個(gè)對(duì)象,在Stack中存儲(chǔ)這個(gè)Heap地址,比如ADDR 34

原始代碼中定義變量b=a,是個(gè)存在的對(duì)象,將a的Stack值(ADDR 34)(Heap地址)賦給b的Stack值

a.x=a={n:2},這句話閱讀順序從左往右。首先,在Heap 34中添加新屬性x:a,現(xiàn)在a的值是ADDR 34,所以新屬性相當(dāng)于x:ADDR 34。然后,把{n:2}賦值給a,因?yàn)槭莻€(gè)新對(duì)象,所以重新分配Heap地址(ADDR 54),并把a(bǔ)的Stack值變更為新的Heap地址(ADDR 51)。

alert(a.x),現(xiàn)在a的值實(shí)際是ADDR 54ADDR 54里面是沒(méi)有x這個(gè)屬性的,所以返回undefined

alert(b.x),b一直是ADDR 34,其中x屬性值為ADDR 54,所以是個(gè)對(duì)象,返回[object Object]

總之就是,原始代碼里對(duì)對(duì)象的操作都在堆內(nèi)存Heap中實(shí)現(xiàn),對(duì)變量的操作都在棧內(nèi)存Stack中實(shí)現(xiàn)。非對(duì)象的Stack值就是直接值,對(duì)象的Stack值是堆內(nèi)存Heap的地址

第四個(gè)

原始代碼中定義變量a={name:"a"},Heap中存儲(chǔ)對(duì)象,Stack中存儲(chǔ)Heap地址(ADDR 101)

原始代碼b=a,把a(bǔ)的Stack值(Heap地址)賦給b的Stack值

原始代碼b={"name":"b"},賦給b一個(gè)新對(duì)象,Heap中存儲(chǔ)新對(duì)象,b的Stack值變更為新的Heap地址(ADDR 301)

所以,a.name沒(méi)有變,還是a

第五個(gè)

原始代碼中定義變量a={name:"a"},Heap中存儲(chǔ)對(duì)象,Stack中存儲(chǔ)Heap地址(ADDR 51)

原始代碼b=a,把a(bǔ)的Stack值(Heap地址)賦給b的Stack值

原始代碼設(shè)置b.name=b,就是ADDR 51中的name值變更為b

所以,a.name也就是ADDR 51中的name值,等于b

這里,a和b的Stack值都指向同一Heap地址ADDR 51,所以無(wú)論對(duì)那個(gè)進(jìn)行操作,都是對(duì)一個(gè)東西做操作,所以會(huì)互相影響

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/107972.html

相關(guān)文章

  • 三個(gè)閉包實(shí)例理解閉包對(duì)內(nèi)存的影響

    摘要:在試圖弄清這個(gè)問(wèn)題之前,先要理解棧內(nèi)存堆內(nèi)存和預(yù)處理。因此在子函數(shù)執(zhí)行的時(shí)候,堆內(nèi)存被占用了,相應(yīng)的棧內(nèi)存也將保留。所以,棧內(nèi)存在執(zhí)行完之后會(huì)被保留一段時(shí)間,這段時(shí)間等于其子函數(shù)執(zhí)行的時(shí)間。 在試圖弄清這個(gè)問(wèn)題之前,先要理解棧內(nèi)存、堆內(nèi)存和預(yù)處理。 占用內(nèi)存,不會(huì)銷毀的閉包實(shí)例 例1: var num = 12; function fn() { var num = 100; ...

    jackzou 評(píng)論0 收藏0
  • JS中對(duì)內(nèi)存的一些了解

    摘要:中對(duì)內(nèi)存的一些了解在進(jìn)行開(kāi)發(fā)的過(guò)程中了解內(nèi)存機(jī)制有助于開(kāi)發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫的代碼在執(zhí)行的過(guò)程中發(fā)生過(guò)什么也能夠提高項(xiàng)目的代碼質(zhì)量?jī)?nèi)存是怎么樣的中變量存放有著原始值與引用值之分原始值原始的數(shù)據(jù)類型以及新加入的引用值等類型的值便是引用 JS中對(duì)內(nèi)存的一些了解 在JS進(jìn)行開(kāi)發(fā)的過(guò)程中, 了解JS內(nèi)存機(jī)制有助于開(kāi)發(fā)人員能夠清晰的認(rèn)識(shí)到自己寫的代碼在執(zhí)行的過(guò)程中發(fā)生過(guò)什么, 也能夠提高...

    elliott_hu 評(píng)論0 收藏0
  • JavaScript 事件對(duì)內(nèi)存和性能的影響

    摘要:事件對(duì)內(nèi)存和性能的影響雖說(shuō)事件處理程序可以為現(xiàn)代頁(yè)面添加很強(qiáng)的交互能力,但是不分青紅皂白就添加大量的事件處理程序絕對(duì)是一種愚蠢的行為。最適合采用事件委托的事件包括和。提交提交某個(gè)表單的操作代碼移除事件處理程序提交中。。。 JavaScript 事件對(duì)內(nèi)存和性能的影響 雖說(shuō)事件處理程序可以為現(xiàn)代 Web 頁(yè)面添加很強(qiáng)的交互能力,但是不分青紅皂白就添加大量的事件處理程序絕對(duì)是一種愚蠢的行為...

    Ajian 評(píng)論0 收藏0
  • WebAssembly 系列(二)JavaScript Just-in-time (JIT) 工作原

    摘要:解釋器的利弊解釋器啟動(dòng)和執(zhí)行的更快。正是因?yàn)檫@個(gè)原因,解釋器看起來(lái)更加適合。這就是為什么最開(kāi)始的瀏覽器都是用解釋器的原因。可是當(dāng)你運(yùn)行同樣的代碼一次以上的時(shí)候,解釋器的弊處就顯現(xiàn)出來(lái)了。起初,監(jiān)視器監(jiān)視著所有通過(guò)解釋器的代碼。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c12f...

    Lin_R 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<