包裝類對象
引見
js里的三個主原始數據範例(數值,字符串及布爾)每一個都有其對應的對象類。
JavaScript中不僅供應了數值型,字符串型及布爾型,它還供應了數值類,字符串類及布爾類。這些類將對應的原始數據範例包裝了起來,它不只具有其原始數據值,而且還定義了屬性和操縱值的要領。
JavaScript能夠很天真的轉換種種數據範例。當你接見一個字符串的屬性或要領時,JavaScript內部會自動建立
其包裝對象。這個字符串包裝對象將替代原始字符串值,它具有已定義的屬性和要領。
如許的運用要領是對的:
var s="hello";//這是一個原始數據值
var S=new String("hello");//這是一個字符串對象
typeof s //"string"
typeof S //"object"
字符串在須要的時刻會自動的轉換為字符串對象。當你對S運用+運算符時,一個對應的原始字符串值將被建立,以便實行運算。
記着,這裏議論的一切內容都一樣作用於數值型和布爾型。末了一點,一切的數值,字符串及布爾都能夠經由過程Object()函數轉換成其對應的對象: var number_wrapper=Object(22)
長處
能夠運用許多運用要領
封裝類對象連繫隱式強迫轉換,讓我們能夠運用許多有用的要領。
當對原始值提取屬性 和 舉行要領調用時, 它表現的就像已運用了對應的對象範例封裝了該值一樣。如——
"hello".toUpperCase(); //"HELLO"
瑕玷
獵取和設置原始範例值的屬性會隱式地建立封裝對象,致使沒有相符預期行動
一是,隱式轉換+封裝類 使得對原始值設置屬性,可能會沒有任何作用
"hello".someProperty=17;
"hello".someProperty; //undefined
這會致使有時刻本想給一個對象設置屬性,但沒想到其是個原始值,如許設置的屬性以後獵取不到,會形成隱蔽的毛病。
而且,因為每次隱式封裝都邑發生一個新的String對象,更新第一個封裝對象並不會形成耐久的影響。
當作相稱比較時,原始範例的封裝對象與其原始值行動不一樣
二是,這意味着,你不能運用內置的操縱符來比較兩個判然不同的String對象的內容
var s1 = new String("hello")
var s2 = new String("hello")
s1 === s2 //false
因為每一個String對象都是一個零丁的對象,氣注重值即是本身。關於非嚴厲相稱運算符,效果一樣云云
s1 == s2 //false