有三種基元包裝類型:String,Number和Boolean。
它們是存在用于處理原始值的引用類型。
在讀取字符串,數(shù)字或布爾值時,會在幕后自動創(chuàng)建原始包裝類型。
我們可以創(chuàng)建一個原始字符串值并將其賦給一個變量。 然后像一個對象一樣處理變量,并使用點符號調(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);
要測試這一點,請嘗試向字符串添加屬性,就像它是常規(guī)對象一樣:
var name = "Javascript";
name.last = "CSS";
console.log(name.last); // undefined
上面的代碼生成以下結(jié)果。
上面的代碼嘗試將屬性 last
添加到字符串 name
。
當使用常規(guī)對象時,我們可以隨時添加屬性。
使用原語wrapper類型,屬性消失,因為對象上屬性被分配后立即被銷毀。
這里是JavaScript引擎中實際發(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;
雖然對原始值自動創(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
運算符返回false,因為只有在讀取值時才創(chuàng)建臨時對象。
我們可以創(chuà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)系; 它是一個對象,所以它的最終計算結(jié)果為true。
我們應(yīng)該避免在代碼中創(chuàng)建基元包裝類型。
更多建議: