国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript引用類型和基本類型詳解

2019-11-20 10:51:03
字體:
來源:轉載
供稿:網友

在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實際上并不符合上面兩種數據類型分類。它是具有兩方面屬性介于兩都之間的一種特殊類型。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 囊谦县| 德兴市| 罗定市| 黄平县| 台东县| 翁源县| 和顺县| 安乡县| 绥德县| 黔南| 霍山县| 宜都市| 锡林郭勒盟| 隆化县| 海南省| 枣阳市| 海盐县| 吴桥县| 乃东县| 邵东县| 乡宁县| 灵丘县| 陆良县| 灌云县| 稻城县| 饶阳县| 锡林浩特市| 柘城县| 大兴区| 石台县| 凤凰县| 大方县| 清新县| 姚安县| 定边县| 阳新县| 长治市| 宜城市| 牟定县| 大庆市| 简阳市|