在javascript中存在著兩種類型的數據:基本類型和引用類型。
基本類型簡單的說就是簡單的數據段。
引用類型是由多個值構成的對象。
當我們進行賦值操作時,解析器會首先分析數據是值類型還是引用類型。
兩種訪問方式:
基本類型值:按值訪問,操作的是他們實際保存的值;
引用類型值:按引用訪問,當查詢時,我們需要先從棧中讀取內存地址,然后再順藤摸瓜地找到保存在堆內存中的值;
下面就分別介紹一下javascript的這兩種數據類型。
一.基本數據類型:
在javascript中存在著六種基本類型數據:string、number、boolean、symbol(ES6新增)、null、undefined。
這五種基本數據類型可以直接操作保存在變量中的實際值。
代碼實例如下:
var a=10;var b=a;b=20;console.log(a);
上面的代碼是一個簡單的賦值操作,下面做一下簡單介紹。
(1).首先數字是基本數據類型。
(2).var b=a,此賦值操作實際上是將a的數據拷貝一份,然后賦值給變量b。
(3).a和b是完全獨立的。
(4).b=20,修改變量b的值不會影響變量a的值。
圖示如下:
棧內存
二.引用類型數據:
在javascript中,引用類型數據存儲在堆內存中,但是不可以直接訪問堆內存空間中的位置和操作堆內存空間。
只能通過操作對象的在棧內存中的引用地址。所以引用類型的數據,在棧內存中保存的實際上是對象在堆內存中的引用地址。通過這個引用地址可以快速查找到保存在堆內存中的對象。
代碼實例:
var obj1=new Object();var obj2=obj1;obj2.name="武林網";console.log(obj1.name);
下面對代碼上面的代碼做一下分下。
(1).var obj1=new Object(),這是創建一個對象,是一個引用類型數據,變量obj1存儲的是對象在堆內存中的地址。
(2).var obj2=obj1,這個賦值操作其實是將對象在堆內存中的存儲地址復制給變量obj2,也就是兩個變量存儲的都是指向實際對象的內存地址,指向的是同一個對象。
(3).obj2.name="武林網",為對象添加一個屬性。
(4).console.log(obj1.name),輸出"武林網,因為兩個變量指向同一個對象。
圖示如下:
String一個特殊的基本數據類型
在很多語言中,String是以對象的形式表示的,但在ECMAScript里沒有沿用這種傳統,String是當作一種基本數據類型,但它是一個比較特殊的基本類型。
看上去好像String應該做為一個引用類型,可實際上它不是,因為它不是對象。那么看起來它應該是基本數據類型,應該是通值傳遞的方式來操作。
看下面例子:
var stra = "這是一個字符串";var strb = stra;stra = "這是另外一個字符串";console.log(strb); // 這是一個字符串
上面例子我們看到,仿佛stra通過值傳遞的方式復制了一份給了strb。當stra改變的時候,strb并沒有改變,似乎我們已經可以下結論,String就是個基本數據類型。
可是,因為String是可以任意長度的,通過值傳遞,一個一個的復制字節顯示效率依然很低,看起來String也可以當作引用類型。
看下面例子:
var a = "myobject";a.name = "myname";console.log(a.name); // undefined
顯示String無法當作一個對象來處理。實際上,javascript里的String是不可以改變的,javascript也沒有提供任何一個改變字符串的方法和語法。
var a = "myobject";a = a.substring(3,5)console.log(a); // bj
記住這樣做,就沒有改變String字符串"myobject",只a引用了另一個字符串"bj","myobject"被回收了。
所以可以這樣講,String實際上并不符合上面兩種數據類型分類。它是具有兩方面屬性介于兩都之間的一種特殊類型。
新聞熱點
疑難解答