JavaScript引用類型和基本類型詳解
在javascript中存在著兩種類型的數(shù)據(jù):基本類型和引用類型。
基本類型簡單的說就是簡單的數(shù)據(jù)段。
引用類型是由多個值構(gòu)成的對象。
當(dāng)我們進(jìn)行賦值操作時,解析器會首先分析數(shù)據(jù)是值類型還是引用類型。
兩種訪問方式:
基本類型值:按值訪問,操作的是他們實(shí)際保存的值;
引用類型值:按引用訪問,當(dāng)查詢時,我們需要先從棧中讀取內(nèi)存地址,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值;
下面就分別介紹一下javascript的這兩種數(shù)據(jù)類型。
一.基本數(shù)據(jù)類型:
在javascript中存在著六種基本類型數(shù)據(jù):string、number、boolean、symbol(ES6新增)、null、undefined。
這五種基本數(shù)據(jù)類型可以直接操作保存在變量中的實(shí)際值。
代碼實(shí)例如下:
var a=10; var b=a; b=20; console.log(a);
上面的代碼是一個簡單的賦值操作,下面做一下簡單介紹。
(1).首先數(shù)字是基本數(shù)據(jù)類型。
(2).var b=a,此賦值操作實(shí)際上是將a的數(shù)據(jù)拷貝一份,然后賦值給變量b。
(3).a和b是完全獨(dú)立的。
(4).b=20,修改變量b的值不會影響變量a的值。
圖示如下:
棧內(nèi)存
二.引用類型數(shù)據(jù):
在javascript中,引用類型數(shù)據(jù)存儲在堆內(nèi)存中,但是不可以直接訪問堆內(nèi)存空間中的位置和操作堆內(nèi)存空間。
只能通過操作對象的在棧內(nèi)存中的引用地址。所以引用類型的數(shù)據(jù),在棧內(nèi)存中保存的實(shí)際上是對象在堆內(nèi)存中的引用地址。通過這個引用地址可以快速查找到保存在堆內(nèi)存中的對象。
代碼實(shí)例:
var obj1=new Object(); var obj2=obj1; obj2.name="腳本之家"; console.log(obj1.name);
下面對代碼上面的代碼做一下分下。
(1).var obj1=new Object(),這是創(chuàng)建一個對象,是一個引用類型數(shù)據(jù),變量obj1存儲的是對象在堆內(nèi)存中的地址。
(2).var obj2=obj1,這個賦值操作其實(shí)是將對象在堆內(nèi)存中的存儲地址復(fù)制給變量obj2,也就是兩個變量存儲的都是指向?qū)嶋H對象的內(nèi)存地址,指向的是同一個對象。
(3).obj2.name="腳本之家",為對象添加一個屬性。
(4).console.log(obj1.name),輸出"腳本之家,因?yàn)閮蓚€變量指向同一個對象。
圖示如下:
String一個特殊的基本數(shù)據(jù)類型
在很多語言中,String是以對象的形式表示的,但在ECMAScript里沒有沿用這種傳統(tǒng),String是當(dāng)作一種基本數(shù)據(jù)類型,但它是一個比較特殊的基本類型。
看上去好像String應(yīng)該做為一個引用類型,可實(shí)際上它不是,因?yàn)樗皇菍ο?。那么看起來它?yīng)該是基本數(shù)據(jù)類型,應(yīng)該是通值傳遞的方式來操作。
看下面例子:
var stra = "這是一個字符串"; var strb = stra; stra = "這是另外一個字符串"; console.log(strb); // 這是一個字符串
上面例子我們看到,仿佛stra通過值傳遞的方式復(fù)制了一份給了strb。當(dāng)stra改變的時候,strb并沒有改變,似乎我們已經(jīng)可以下結(jié)論,String就是個基本數(shù)據(jù)類型。
可是,因?yàn)镾tring是可以任意長度的,通過值傳遞,一個一個的復(fù)制字節(jié)顯示效率依然很低,看起來String也可以當(dāng)作引用類型。
看下面例子:
var a = "myobject"; a.name = "myname"; console.log(a.name); // undefined
顯示String無法當(dāng)作一個對象來處理。實(shí)際上,javascript里的String是不可以改變的,javascript也沒有提供任何一個改變字符串的方法和語法。
var a = "myobject"; a = a.substring(3,5) console.log(a); // bj
記住這樣做,就沒有改變String字符串"myobject",只a引用了另一個字符串"bj","myobject"被回收了。
所以可以這樣講,String實(shí)際上并不符合上面兩種數(shù)據(jù)類型分類。它是具有兩方面屬性介于兩都之間的一種特殊類型。
相關(guān)文章
js實(shí)現(xiàn)前端圖片上傳即時預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)前端圖片即時預(yù)覽功能,本地預(yù)覽功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08前端終止請求的3種方式總結(jié)(ajax、axios)
這篇文章主要給大家總結(jié)介紹了關(guān)于前端終止請求的3種方式,其中包括ajax、axios的相關(guān)資料, 取消請求在前端有時候會用到,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09taro 實(shí)現(xiàn)購物車邏輯的實(shí)例代碼
這篇文章主要介紹了taro 實(shí)現(xiàn)購物車邏輯,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06js中arguments,caller,callee,apply的用法小結(jié)
本篇文章只要是對js中arguments,caller,callee,apply的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01