最近在看Symbol不能使用new操作符,然后類比到Number,String,Boolean,因為它們同屬於基本類型,但是有有所差異:Number,String,Boolean是可以使用new操作符進行實例的輸出的。出個題:
var abc = 'abc', str1 = String(abc), str2 = new String(abc); //判斷下面輸出 str1 === abc //true str2 === abc //false
這里其實考察的是值類型和引用類型,String()返回的是字符串,即基本類型,而new String()返回的是一個對象,str2是引用存儲,值存儲 !== 引用存儲的。
再來個題目:
var Fun1=function(){ return String('miya'); }; var fun1 = String('miya') fun1 === new Fun1() //false fun1 === Fun1() //true
其實下面fun1 === Fun1() 這個肯定是true了,因為返回都是基本類型string,但是new出來的對象就不一樣了,它返回的是引用類型了。
存取字符串,數字或者布爾值的屬性時創建的臨時對象稱作包裝對象。
var str = "miya",num = 1,boo = true; var Str = new String(str); var Num = new Number(num); var Boo = new Boolean(boo); console.log(str == Str); //true console.log(num == Num); //true console.log(Boo == boo); //true
當使用全等時候str !== Str的,因為前者原始值,后者引用引用類型。使用==時候為true,是因為:Javascript會在必要時候將包裝對象轉化為原始值。
Javascript中三種基本包裝類型:Boolean,Number,String。
當調用str.substring(0) //"miya",實際上JS內部隱式的幫我們創建了一個包裝對象,調用substring方法時候實際過程是:
var a1 = new String("miya"); var a2 = a1.substring(0); a1 = null; console.log(a2); //miya
這個是在基本類型string調用屬性時候瀏覽器隱式創建的包裝對象。隱式創建的對象,在使用完畢后會被銷毀掉。
隱式包裝對象和自己顯示創建的包裝對象差別點在於:
對象的生存周期,你用new操作符創建的引用類型的實例,一直保存在內存中除非手動銷毀,而瀏覽器隱式創建的包裝對象只存在於你操作string,boolean,number原始值屬性時候,用完即銷毀,這樣我們就不能手動為基本類型添加屬性和方法了。
【完】
書卷多情似故人,晨昏憂樂每相親。