Js 基本數據類型、引用數據類型

數據類型

1.   ECMAScript變量包含兩種不一樣類型的值:基本類型值、引用類型值;函數

2.   基本類型值:指的是保存在棧內存中的簡單數據段;工具

3.   引用類型值:指的是那些保存在堆內存中的對象,意思是,變量中保存的實際上只是一個指針,這個指針指向內存堆中實際的值;指針

兩種訪問方式

4.   基本類型值:按值訪問,操做的是他們實際保存的值;對象

5.   引用類型值:按引用訪問,當查詢時,咱們須要先從棧中讀取內存地址,而後再順藤摸瓜地找到保存在堆內存中的值;blog

兩種類型複製

 基本類型變量的複製:ip

 從一個變量向一個變量複製時,會在棧中建立一個新值,而後把值複製到爲新變量分配的位置上,改變源數據不會影響到新的變量(互不干涉);內存

引用類型變量的複製:ci

複製的是存儲在棧中的指針,將指針複製到棧中未新變量分配的空間中,而這個指針副本和原指針執行存儲在堆中的同一個對象,複製操做結束後,兩個變量實際上將引用同一個對象;所以改變其中的一個,將影響另外一個;it

函數參數的傳遞

1.   ECMA中全部函數的參數都是按值傳遞的;io

在向參數傳遞基本類型的值時,被傳遞的值會被複制給一個局部變量,在向參數傳遞引用類型的值時,會把這個值在內存的地址複製給一個局部變量

基本數據類型傳遞參數

  funciton addTen(num){

    num+=10;

    return num;

  }

  var count=20;

  var result=addTen(count);

  alert(count);//20

  alert(resullt);//30

  執行結果是:20和30。在這段代碼中,將變量count當作參數傳遞給了函數addTen,也就是至關於將變量count的值複製給了函數addTen的參數。這時addTen的參數num能夠看作是函數內部的一個變量。在上段代碼中,就至關於兩個基本數據類型變量之間的值複製。而基本數據類型都有本身獨立的內存地址,因此num和count是沒有任何關係的,他們只是值相等而已,函數執行完畢後,count的值並無改變。而函數外面的result是被直接賦值的,因此result的值就是函數的結果30。

引用類型傳遞參數

  function setName(obj){

    obj.name="LSN";

  }

  var person=new Object();

  setName(person);

  alert(person.name);//LSN

  執行結果是:LSN。在這段代碼中,函數setName的做用是給obj對象添加了一個屬性name並給該屬性賦值爲"LSN",由於obj是引用類型,因此這裏屬因而將引用類型person賦值給了obj,也就是說person和obj引用了一個內存地址,因此當給obj新加了屬性name時,在函數外面的person也跟着改變,最後person.naem的結果爲LSN。

引用類型傳遞參數到底傳的是值仍是引用

  function setName(obj){

    obj.name="ABC";

    obj=new Object();

    obj.name="BCD";

  }

  var person=new Object();

  setName(person);

  alert(person.name);// ABC

  執行結果是:ABC。實例3與實例2的區別是在函數中又加了2行代碼,在給obj對象新加一個屬性name並賦值後 又將obj定義成了一個新的對象(new Object()),定義新對象後又name賦上新的值「BCD」。這個時候若是是按引用傳遞的話,那麼最後person對象就會自動修改成指向其name屬性爲"BCD"的新對象,但最後顯示的倒是「ABC」,這說明即便在函數內部修改了參數的值,但原始的引用還保持不變。實際上,當在函數內部obj=new Object()時 這個新的obj就已經成爲函數內部的局部對象了,這個對象會在函數執行完畢後自動銷燬。

兩種變量類型檢測

1.   Typeof操做符是檢測基本類型的最佳工具;

2.   若是變量值是nul或者對象,typeof 將返回「object」;

3.   Instanceof用於檢測引用類型,能夠檢測到具體的,它是什麼類型的實例;

4.   若是變量是給定引用類型的實例,instanceof操做符會返回true;

 

相關文章
相關標籤/搜索