js裏的三個主原始數據類型(數值,字符串及布爾)每個都有其對應的對象類。app
JavaScript中不只提供了數值型,字符串型及布爾型,它還提供了數值類,字符串類及布爾類。這些類將對應的原始數據類型包裝了起來,它不但擁有其原始數據值,並且還定義了屬性和操做值的方法。函數
JavaScript可以很靈活的轉換各類數據類型。當你訪問一個字符串的屬性或方法時,JavaScript內部會自動建立
其包裝對象。這個字符串包裝對象將替換原始字符串值,它擁有已定義的屬性和方法。code
這樣的使用方法是對的:對象
var s="hello";//這是一個原始數據值 var S=new String("hello");//這是一個字符串對象 typeof s //"string" typeof S //"object"
字符串在須要的時候會自動的轉換爲字符串對象。當你對S使用+運算符時,一個對應的原始字符串值將被建立,以便執行運算。ip
記住,這裏討論的全部內容都一樣做用於數值型和布爾型。最後一點,全部的數值,字符串及布爾均可以經過Object()函數轉換成其對應的對象: var number_wrapper=Object(22)字符串
封裝類對象結合隱式強制轉換,讓咱們可使用不少實用的方法。
當對原始值提取屬性 和 進行方法調用時, 它表現的就像已經使用了對應的對象類型封裝了該值同樣。如——string
"hello".toUpperCase(); //"HELLO"
一是,隱式轉換+封裝類 使得對原始值設置屬性,可能會沒有任何做用class
"hello".someProperty=17; "hello".someProperty; //undefined
這會致使有時候本想給一個對象設置屬性,但沒想到其是個原始值,這樣設置的屬性以後獲取不到,會形成隱藏的錯誤。
而且,由於每次隱式封裝都會產生一個新的String對象,更新第一個封裝對象並不會形成持久的影響。object
二是,這意味着,你不能使用內置的操做符來比較兩個大相徑庭的String對象的內容數據類型
var s1 = new String("hello") var s2 = new String("hello") s1 === s2 //false
因爲每一個String對象都是一個單獨的對象,氣重視值等於自身。對於非嚴格相等運算符,結果一樣如此
s1 == s2 //false