今天遇到一道面試題,如下:
涉及知識點有兩個:
(1)js中定義字符串的三種方法區別
三種方法如下:
var str = 'ABC'; var str1 = String('ABC'); var str2 = new String('ABC');
經過比較測試發現:
instanceof 判斷對象的類型,通過判斷對象的原型鏈中能否找到類型的 prototype
三者的區別在於使用new定義的字符串其類型是object對象。
我們都知道js中類型分為基本類型:Boolean、Number、String、Null、Undefined、symbol(es6)和引用類型:Object。
基本類型是存儲在棧(stack)內存中的,數據大小確定,內存空間大小可以分配。
引用類型是存儲在堆(heap)內存中的,並在棧中存儲指向堆的地址。
因此前兩種方式定義的是存儲在棧中且值相等,而第三種方法定義的只是棧中的指針。
擴展知識:原始類型與包裝對象
在js中number、string、boolean三者屬於原始類型,它們都存在支持構造函數且可用於初始化原始值的包裝對象new Number()、new String()、new Boolean()。
我們會看到這種代碼:
console.log(str.length) // 3 str.say = 'hello' console.log(str.say) //undefined
為什么可以像對象一般直接訪問原始類型str的length屬性呢?
這是因為當用到某個原始值的方法或屬性時,后台會自動創建相應的原始包裝類型的對象,從而暴露出操作原始值的各種方法,當用完時銷毀。
而為什么不能為其添加方法或屬性呢?
因為包裝對象的生命周期只存在於訪問它的那行代碼執行期間,上方代碼第一行調用length對象會創建一次包裝對象,第二行也會創建一次包裝對象並為其賦予say屬性,第三行也會創建一次包裝對象,這三行的對象是不同的,且在當行執行完后就被銷毀,因此不能在運行期間給原始值添加屬性或方法。相比於此,使用new關鍵字實例化引用類型的生命周期會在離開作用域時被銷毀。
綜上:包裝對象也是對象,從而得到打印三種類型分別為:string(原始類型) , string(原始類型) , object(包裝對象).
(2)switch case的判斷是全等(===)判斷。
全等要滿足:1、引用類型:指向同一個對象(同一個地址)。
2、基本類型:類型必須相同,值必須相等。
