JS的數(shù)據(jù)類型

數(shù)據(jù)結(jié)構(gòu)

  • 棧:棧是只允許在一端進行插入和刪除操作的線性表,是一種先進后出的數(shù)據(jù)結(jié)構(gòu)。(基本數(shù)據(jù)類型)
    采用數(shù)組的pop()和unshift()方法可以模擬棧的先進后出。
  • 隊列:隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)。(事件循環(huán)隊列)
    采用數(shù)組的pop()和push()方法可以模擬棧的先進后出。
  • 堆:堆是基于散列算法的數(shù)據(jù)結(jié)構(gòu)。(引用數(shù)據(jù)類型)

數(shù)據(jù)類型

JS的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

基本數(shù)據(jù)類型(采用按值訪問)

  1. 定義:基本數(shù)據(jù)是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,它是將類型的值直接保存在棧中的某一個位置。
  2. 分類:null,undefined,string,boolean,number,symbol
  3. 基本數(shù)據(jù)類型的值是不變的。
    var str = 'hello'
    str.toUpperCase()
    console.log(str) // hello  
    //值未發(fā)生改變
    
  4. number 類型采用IEEE745雙精度的浮點類型
    0.1 + 0.2 !== 0.3 //true
    
  5. null不是對象類型,是基本數(shù)據(jù)類型
    typeof null  //object
    
    這是JS的一個bug,在最開始的時候,JS采用32位系統(tǒng),為了性能考慮,采用低位存儲數(shù)據(jù)的類型,000開頭代表對象,null全為0,誤判斷為object。
  6. NaN是基本類型,屬于number
    NaN !== NaN  // true
    
  7. 存儲在棧內(nèi)存中,復制的是值,改變其中一個值對另一個沒有影響。
    var a = 1;
    var b = a;
    b = 2;
    console.log(a) // 1
    console.log(b) // 2
    //未改變a的值
    
  8. 聲明一個變量,但未初始化,值為undefined
    let a;
    console.log(a) //undefined
    
  9. 當定義一個變量用來表示對象,建議初始化為null
  10. false和true時區(qū)分大小的。其中
    false,0,-0,'',null,undefined,NaN類型轉(zhuǎn)換時轉(zhuǎn)換為false,其他為true。
    
  11. symbol的值是唯一的,并且他不支持new Symbol()
    var symbol1 = Symbol()
    var symbol2 = Symbol()
    console.log(symbol1 === symbol2)  // false
    
  12. null和undefined的區(qū)別
    • null是一個表示無的對象,轉(zhuǎn)換為數(shù)值為0,undefined表示一個無的原始值,轉(zhuǎn)換為數(shù)值表示為NaN.
    undefined == null // true (會進行隱式類型轉(zhuǎn)換)
    undefined === null  // false
    
    • null表示此處不應該有值,表示一個對象被原始的設置為空值;作為函數(shù)的參數(shù),表示該參數(shù)不應該是一個對象;作為原型鏈的終點。
    • undefined,表示缺少值。變量聲明未賦值為undefined;數(shù)參數(shù)沒有傳實參為undefined;對象屬性沒有賦值為undefined;函數(shù)沒有返回值,默認return undefined;訪問對象不存在的屬性為undefined;使用void表達式求值,為undefined.
    void 0 //undefined
    void function f(){} //undefined
    

引用數(shù)據(jù)類型(復雜數(shù)據(jù)類型,采用引用訪問。)

  1. 定義:引用類型是在棧內(nèi)存中保存指向堆內(nèi)存中的地址指針,在堆內(nèi)存中保存具體內(nèi)容的數(shù)據(jù)類型。
  2. 分類:引用類型統(tǒng)稱為Object對象,具體可分為Object,Array,Date,RegExp,Function等
  3. 直接賦值引用類型的值是可變的。
    var obj = {
      a: 1
    }
    var obj1 = obj;
    obj1.a = 2
    console.log(obj.a) // 2
    console.log(obj1.a) // 2
    
    引用類型采用棧內(nèi)存存儲指向地址指針,當var obj1 = obj的時候,其實賦值的是地址指針,當obj1.a=2的時候,改變的是地址指針指向的堆內(nèi)存的內(nèi)容,因為obj1和obj2的地址指針指向同一堆塊內(nèi)存地址,所以改變一個,堆內(nèi)存的內(nèi)容也都改變了。
  4. 堆內(nèi)存進行比較是引用比較,比較地址是否一致
    var obj1 = {a: 1}
    var obj2 = {a:1}
    console.log(obj1 === obj2)  // false
    // 每創(chuàng)建一個對象其實都會創(chuàng)建一個新的內(nèi)存,就算內(nèi)容完全一致,地址指針也是不一樣的。
    
  5. 引用類型的值是保存在堆內(nèi)存中的對象。
  6. 引用類型直接賦值,會互相影響,所以采用深拷貝和淺拷貝,(拷貝具體的內(nèi)容,而不是像賦值一樣,只賦值地址指針)在對新對象進行操作的時候,便不會影響原來的對象。
    深拷貝及淺拷貝
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容