JavaScript中的資料型別-儲存差別

XiSoil發表於2024-09-05

總結

  1. 宣告變數時不同的記憶體地址分配:
    • 簡單型別的值存放在棧中,在棧中存放的是對應的值
    • 引用型別對應的值儲存在堆中,在棧中存放的是指向堆記憶體的地址
  2. 不同的型別資料導致賦值變數時的不同:
    • 簡單型別賦值,是生成相同的值,兩個物件對應不同的地址
    • 複雜型別賦值,是將儲存物件的記憶體地址賦值給另一個變數。也就是兩個變數指向堆記憶體中同。一個物件

基本型別

  • Number
    數值最常見的整數型別格式則為十進位制,還可以設定八進位制(零開頭)、十六進位制(0x開頭)

    let num_1 = 11 // 10 進位制
    let num_2 = 030 // 8 進位制
    let num_3 = 0xC // 16 進位制
    

    浮點型別則在數值彙總必須包含小數點,還可透過科學計數法表示

    // 浮點
    num_1 = 1.1
    num_2 = .1 // 不推薦使用這種方式定義--可讀性差,風格不一致,程式碼規範,容易出錯
    num_3 = 1.3e4 // 科學記數法
    

    在數值型別中,存在一個特殊數值 NaN ,意為 不是數值 ,用於表示本來要返回數值的操作失敗了(而不是丟擲錯誤)

  • String
    字串可以使用雙引號 ""、單引號 '' 或反引號 `` 表示

    let str = 'abc'
    let stri = "ef"
    let strin = `ghi`
    console.log([str, stri, strin])
    

    字串是不可變的,意思是一旦建立,它們的值就不能變了

    let lang = 'Java'
    lang = lang + 'Script' // 先銷燬在建立
    console.log(lang)
    

    任何看似修改字串的操作實際上都會建立並返回一個新的字串

  • Boolean
    Boolean(布林值)型別有兩個字面值:truefalse
    透過 Boolean 可以將其他型別的資料轉化成布林值

    資料型別 轉換為 true 的值 轉換為 false 的值
    String 非空字串 空字串
    Number 非零數值(包括無窮值) 0, NaN
    Object 任意物件 N/A(不存在)
    Undefined N/A(不存在) undefined
  • Undefined
    Undefined 型別只有一個值,就是特殊值undefined,當我們宣告變數但沒有初始化時,變數會有一個預設的 undefined

    let und
    console.log(und)
    

    當我們試圖越界訪問不存在的值時,也會得到 undefined

    let list = []
    console.log(list[0])
    
  • null
    Null 型別同樣只有一個值,即特殊值null
    邏輯上講, null 值表示一個空物件指標,這也是給 typeof傳一個null會返回object的原因

    const Null = null
    console.log(typeof Null)
    

    undefined值是由null值派生而來
    只要變數要儲存物件,而當時又沒有那個物件可儲存,就可用null來填充該變數

  • symbol

    Symbol (符號)是原始值,且符號例項是唯一、不可變的。符號的用途是確保物件屬性使用唯一識別符號,不會發生屬性衝突的危險

    let genericSymbol=Symbol();
    let otherGenericSymbol=Symbol();
    console.log(genericSymbol === otherGenericSymbol);// false
    let fooSymbol=Symbol('foo');
    let otherFooSymbol=Symbol('foo');
    console.log(fooSymbol === otherFooSymbol);//false
    
let a= 10;
let b = a;// 賦值操作
b = 20;
console.log(a);//10值

a 的值為一個基本型別,是儲存在棧中,將a的值賦給b,雖然兩個變數的值相等,但是兩個變數儲存了兩個不同的記憶體地址

引用型別

  • Object
  • Array
  • Function
  • Date
  • RegExp
  • Map
  • ......
const obj1 = {}
const obj2 = obj1
obj2.lang = "javaScript"
console.log(obj1)

引用型別資料存放在堆中,每個堆記憶體物件都有對應的引用地址指向它,引用地址存放在棧中。

obj1 是一個引用型別,在賦值操作過程彙總,實際是將堆記憶體物件在棧記憶體的引用地址複製了一份給了 obj2 ,實際上他們共同指向了同一個堆記憶體物件,所以更改 obj2 會對 obj1 產生影響

相關文章