有三種基元包裝類型:String,Number和Boolean。
它們是存在用于處理原始值的引用類型。
在讀取字符串,數(shù)字或布爾值時(shí),會(huì)在幕后自動(dòng)創(chuàng)建原始包裝類型。
我們可以創(chuàng)建一個(gè)原始字符串值并將其賦給一個(gè)變量。 然后像一個(gè)對象一樣處理變量,并使用點(diǎn)符號(hào)調(diào)用其函數(shù)。
var name = "Javascript";
var firstChar = name.charAt(0);
console.log(firstChar);
上面的代碼生成以下結(jié)果。
以下代碼是幕后發(fā)生的:
var name = "Javascript";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);
要測試這一點(diǎn),請嘗試向字符串添加屬性,就像它是常規(guī)對象一樣:
var name = "Javascript";
name.last = "CSS";
console.log(name.last); // undefined
上面的代碼生成以下結(jié)果。
上面的代碼嘗試將屬性 last
添加到字符串 name
。
當(dāng)使用常規(guī)對象時(shí),我們可以隨時(shí)添加屬性。
使用原語wrapper類型,屬性消失,因?yàn)閷ο笊蠈傩员环峙浜罅⒓幢讳N毀。
這里是JavaScript引擎中實(shí)際發(fā)生的事情:
// what the JavaScript engine does
var name = "Javascript";
var temp = new String(name);
temp.last = "CSS";
temp = null; // temporary object destroyed
var temp = new String(name);
console.log(temp.last); // undefined
temp = null;
雖然對原始值自動(dòng)創(chuàng)建引用值,但這些值的 instanceof
返回false:
var name = "Javascript";
var count = 10;
var found = false;
console.log(name instanceof String); // false
console.log(count instanceof Number); // false
console.log(found instanceof Boolean); // false
上面的代碼生成以下結(jié)果。
instanceof
運(yùn)算符返回false,因?yàn)橹挥性谧x取值時(shí)才創(chuàng)建臨時(shí)對象。
我們可以創(chuàng)建原始包裝器 類型手動(dòng),但有一定的副作用:
var name = new String("Javascript");
var count = new Number(10);
var found = new Boolean(false);
console.log(typeof name); // "object"
console.log(typeof count); // "object"
console.log(typeof found); // "object"
上面的代碼生成以下結(jié)果。
我們不能使用String,Number和Boolean對象將原始值。
例如,以下代碼使用Boolean對象。
var found = new Boolean(false);
if (found) {
console.log("Found"); // this executes
} else{
console.log("Not Found"); // this executes
}
上面的代碼生成以下結(jié)果。
布爾對象是 false
,但 if(found)
return true
。
對象表示為false沒有關(guān)系; 它是一個(gè)對象,所以它的最終計(jì)算結(jié)果為true。
我們應(yīng)該避免在代碼中創(chuàng)建基元包裝類型。
更多建議: