Javascript中變量類型分為原始類型和對象類型兩類:
值類型(原始類型)
字符串 string 、數(shù)值 number、布爾值 boolean、null、undefined。
引用類型(對象類型)
對象 Object、數(shù)組 Array、函數(shù) function。
區(qū)別
值類型
- 占用空間固定,保存在棧中
當(dāng)一個(gè)方法執(zhí)行時(shí),每個(gè)方法都會建立自己的內(nèi)存棧。
在這個(gè)方法內(nèi)定義的變量將會逐個(gè)放入這塊棧內(nèi)存里,隨著方法執(zhí)行結(jié)束,這個(gè)方法的內(nèi)存棧也將自然銷毀。
因此,所有在方法中定義的變量都是放在棧內(nèi)存中的;棧中存儲的是基礎(chǔ)變量以及一些對象的引用變量,基礎(chǔ)變量的值是存儲在棧中,而引用變量存儲在棧中的是指向堆中的數(shù)組或者對象的地址,這就是為何修改引用類型總會影響到其他指向這個(gè)地址的引用變量。 - 值的變量賦值,保存與復(fù)制的是值的本身
- 值類型無法添加屬性和方法
- 使用typeof檢測數(shù)據(jù)類型
- typeof 區(qū)分不出來引用類型(除了函數(shù))
- 值類型的比較是指的比較
注:==比較時(shí)會做類型轉(zhuǎn)換,是值的比較;===是值和類型的比較,只有值和類型同時(shí)相等時(shí),才能相等。
引用類型
- 占用空間不固定,保存在堆中
當(dāng)我們在程序中創(chuàng)建一個(gè)對象時(shí),這個(gè)對象將被保存到運(yùn)行時(shí)數(shù)據(jù)區(qū)中,以便反復(fù)利用(因?yàn)閷ο蟮膭?chuàng)建成本通常較大),這個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)就是堆內(nèi)存。
堆內(nèi)存中的對象不會隨方法的結(jié)束而銷毀,即使方法結(jié)束后,這個(gè)對象還可能被另一個(gè)引用變量所引用(方法的參數(shù)傳遞時(shí)很常見),則這個(gè)對象依然不會被銷毀,只有當(dāng)一個(gè)對象沒有任何引用變量引用它時(shí),系統(tǒng)的垃圾回收機(jī)制才會在核實(shí)的時(shí)候回收它。 - 引用類型可以添加屬性和方法
- 保存與復(fù)制的是指向?qū)ο蟮闹羔?/li>
- 使用instanceof檢測數(shù)據(jù)類型
- 引用類型的比較是引用地址的比較