最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解Javascript_01_理解內(nèi)存分配原理分析

 更新時(shí)間:2010年10月11日 22:52:45   作者:  
在正式開(kāi)始之前,我想先說(shuō)兩句,理解javascript系列博文是通過(guò)帶領(lǐng)大家分析javascript執(zhí)行時(shí)的內(nèi)存分配情況,來(lái)解釋javascript原理,具體會(huì)涵蓋javascript預(yù)加載,閉包原理,面象對(duì)象,執(zhí)行模型,對(duì)象模型...,文章的視角很特別,也非常深入,希望大家能接受這種形式,并提供寶貴意見(jiàn)。
原始值和引用值
在ECMAScript中,變量可以存放兩種類(lèi)型的值,即原始值和引用值。
原始值指的就是代表原始數(shù)據(jù)類(lèi)型(基本數(shù)據(jù)類(lèi)型)的值,即Undefined,Null,Number,String,Boolean類(lèi)型所表示的值。
引用值指的就是復(fù)合數(shù)據(jù)類(lèi)型的值,即Object,Function,Array,以及自定義對(duì)象,等等

棧和堆
與原始值與引用值對(duì)應(yīng)存在兩種結(jié)構(gòu)的內(nèi)存即棧和堆
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),在javascript中可以通過(guò)Array來(lái)模擬棧的行為
復(fù)制代碼 代碼如下:

var arr = []; //創(chuàng)建一個(gè)棧
arr.push("apple");//壓入元素"apple" ["apple"]
arr.push("orange");//壓入元素"orange" ["apple","orange"]
arr.pop();//彈出"orange" ["apple"]
arr.push("banana");//壓入元素"banana" ["apple","banana"]

我們來(lái)看一下,與之對(duì)應(yīng)的內(nèi)存圖:

原始值是存儲(chǔ)在棧中的簡(jiǎn)單數(shù)據(jù)段,也就是說(shuō),他們的值直接存儲(chǔ)在變量訪問(wèn)的位置。
堆是存放數(shù)據(jù)的基于散列算法的數(shù)據(jù)結(jié)構(gòu),在javascript中,引用值是存放在堆中的。
引用值是存儲(chǔ)在堆中的對(duì)象,也就是說(shuō),存儲(chǔ)在變量處的值(即指向?qū)ο蟮淖兞浚鎯?chǔ)在棧中)是一個(gè)指針,指向存儲(chǔ)在堆中的實(shí)際對(duì)象.
例:var obj = new Object(); obj存儲(chǔ)在棧中它指向于new Object()這個(gè)對(duì)象,而new Object()是存放在堆中的。
那為什么引用值要放在堆中,而原始值要放在棧中,不都是在內(nèi)存中嗎,為什么不放在一起呢?那接下來(lái),讓我們來(lái)探索問(wèn)題的答案!
首先,我們來(lái)看一下代碼:
復(fù)制代碼 代碼如下:

function Person(id,name,age){
this.id = id;
this.name = name;
this.age = age;
}
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"jxl",22);

然后我們來(lái)看一下內(nèi)存分析圖:

變量num,bol,str為基本數(shù)據(jù)類(lèi)型,它們的值,直接存放在棧中,obj,person,arr為復(fù)合數(shù)據(jù)類(lèi)型,他們的引用變量存儲(chǔ)在棧中,指向于存儲(chǔ)在堆中的實(shí)際對(duì)象。

由上圖可知,我們無(wú)法直接操縱堆中的數(shù)據(jù),也就是說(shuō)我們無(wú)法直接操縱對(duì)象,但我們可以通過(guò)棧中對(duì)對(duì)象的引用來(lái)操作對(duì)象,就像我們通過(guò)遙控機(jī)操作電視機(jī)一樣,區(qū)別在于這個(gè)電視機(jī)本身并沒(méi)有控制按鈕。


現(xiàn)在讓我們來(lái)回答為什么引用值要放在堆中,而原始值要放在棧中的問(wèn)題:

記住一句話:能量是守衡的,無(wú)非是時(shí)間換空間,空間換時(shí)間的問(wèn)題

堆比棧大,棧比堆的運(yùn)算速度快,對(duì)象是一個(gè)復(fù)雜的結(jié)構(gòu),并且可以自由擴(kuò)展,如:數(shù)組可以無(wú)限擴(kuò)充,對(duì)象可以自由添加屬性。將他們放在堆中是為了不影響棧的效率。而是通過(guò)引用的方式查找到堆中的實(shí)際對(duì)象再進(jìn)行操作。相對(duì)于簡(jiǎn)單數(shù)據(jù)類(lèi)型而言,簡(jiǎn)單數(shù)據(jù)類(lèi)型就比較穩(wěn)定,并且它只占據(jù)很小的內(nèi)存。不將簡(jiǎn)單數(shù)據(jù)類(lèi)型放在堆是因?yàn)橥ㄟ^(guò)引用到堆中查找實(shí)際對(duì)象是要花費(fèi)時(shí)間的,而這個(gè)綜合成本遠(yuǎn)大于直接從棧中取得實(shí)際值的成本。所以簡(jiǎn)單數(shù)據(jù)類(lèi)型的值直接存放在棧中。

總結(jié):

程序很簡(jiǎn)單,但它是一切的根本,基礎(chǔ)是最重要的,因?yàn)槟μ齑髲B也是一塊磚一塊瓦的搭建起來(lái)的。
內(nèi)存是程序執(zhí)行的根本,搞懂了內(nèi)存,就等于搞懂了一切。
心血之作,鼓勵(lì)一下自已,加油!

參考:
JavaScript高級(jí)程序設(shè)計(jì)

相關(guān)文章

  • JS設(shè)置緩存和緩存過(guò)期時(shí)間的操作方法

    JS設(shè)置緩存和緩存過(guò)期時(shí)間的操作方法

    js-cookie是一個(gè)用于處理瀏覽器Cookie的JavaScript庫(kù),本文通過(guò)實(shí)例代碼講解JS設(shè)置緩存和緩存過(guò)期時(shí)間的操作方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 微信小程序block的使用教程

    微信小程序block的使用教程

    這篇文章主要介紹了微信小程序block的使用 ,微信小程序最近非常火熱,實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,只要block就可以實(shí)現(xiàn),需要的朋友可以參考下
    2018-04-04
  • 前端如何寫(xiě)一個(gè)大文件上傳組件詳細(xì)步驟

    前端如何寫(xiě)一個(gè)大文件上傳組件詳細(xì)步驟

    在現(xiàn)代Web應(yīng)用中,大文件上傳是一個(gè)常見(jiàn)的需求,尤其是在云存儲(chǔ)、社交媒體和協(xié)作平臺(tái)等領(lǐng)域,這篇文章主要介紹了前端如何寫(xiě)一個(gè)大文件上傳組件詳細(xì)步驟,需要的朋友可以參考下
    2025-04-04
  • ES6中參數(shù)的默認(rèn)值語(yǔ)法介紹

    ES6中參數(shù)的默認(rèn)值語(yǔ)法介紹

    這ES6允許為函數(shù)參數(shù)設(shè)置默認(rèn)值,即直接寫(xiě)在參數(shù)定義后面。下面篇文章主要介紹了ES6中參數(shù)默認(rèn)值語(yǔ)法的相關(guān)資料,對(duì)大家具有一定的參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-05-05
  • 詳解JavaScript中Canvas的高級(jí)繪圖和動(dòng)畫(huà)技術(shù)

    詳解JavaScript中Canvas的高級(jí)繪圖和動(dòng)畫(huà)技術(shù)

    JavaScript中的Canvas 是一個(gè)強(qiáng)大的 HTML5 元素,允許你通過(guò)編程方式創(chuàng)建圖形、繪制圖像和實(shí)現(xiàn)復(fù)雜的動(dòng)畫(huà)效果,在本文中,我們將深入探討 JavaScript Canvas 的高級(jí)繪圖和動(dòng)畫(huà)技術(shù),并提供一個(gè)復(fù)雜的案例,以展示其潛力,需要的朋友可以參考下
    2023-10-10
  • ES6中class類(lèi)用法實(shí)例淺析

    ES6中class類(lèi)用法實(shí)例淺析

    這篇文章主要介紹了ES6中class類(lèi)用法,結(jié)合實(shí)例形式分析了ES6中類(lèi)的實(shí)現(xiàn)方法與相關(guān)語(yǔ)法使用技巧,需要的朋友可以參考下
    2017-04-04
  • Javascript事件的捕獲方式和冒泡方式詳解

    Javascript事件的捕獲方式和冒泡方式詳解

    這篇文章主要為大家介紹了Javascript事件的捕獲方式和冒泡方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 在微信小程序中渲染HTML內(nèi)容的方法示例

    在微信小程序中渲染HTML內(nèi)容的方法示例

    這篇文章主要介紹了在微信小程序中渲染HTML內(nèi)容的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Add Formatted Data to a Spreadsheet

    Add Formatted Data to a Spreadsheet

    Add Formatted Data to a Spreadsheet...
    2007-06-06
  • javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載

    javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評(píng)論

长乐市| 新丰县| 富顺县| 靖西县| 县级市| 松桃| 甘肃省| 安远县| 股票| 陆良县| 双鸭山市| 喀喇沁旗| 仪陇县| 商南县| 息烽县| 凤冈县| 河源市| 中西区| 江阴市| 全南县| 抚松县| 朝阳区| 伊川县| 当涂县| 安义县| 天镇县| 潮州市| 垫江县| 江源县| 富顺县| 平湖市| 铁岭市| 苏尼特左旗| 洛川县| 无棣县| 民权县| 城步| 镇巴县| 汝城县| 讷河市| 五家渠市|