Javascript中String()和new String()的區別——JS的包裝對象


最近在看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原始值屬性時候,用完即銷毀,這樣我們就不能手動為基本類型添加屬性和方法了。

 

【完】

 書卷多情似故人,晨昏憂樂每相親。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM