javascirpt包裝對象(wrapper object)

什麼是javascript包裝對象?在說包裝對象之前,我們先簡單說一下js的兩種數據類型:基本數據類型(primitive type)和對象數據類型(object type)。

基本數據類型:值類型,值不可以改變 immutable,沒有屬性。包括number、string、boolean、null、undefined

對象數據類型:引用類型,值可以改變 mutable,有屬性。包括Function、Array、Date、RegExp、Error。

因此,看起來值類型應該是不具備屬性方法的一類數據,然而,舉個栗子:

例1:
var s = "test";
s.len = 4; //設置s的屬性len爲4
var t = s.len;
console.log(t);  //undefined
例2:
var s = "test";
var S = s.toUpperCase(); //看起來字符串s也有方法toUpperCase(),和對象行爲很相似
console.log(s);  //"test"
console.log(S);  //"TEST"

看上面的例子,發現字符串作爲基本數據類型,也可以使用“.”操作符s.toUpperCase(),行爲很像對象數據類型,也有屬性,why?例1裏面的s.len這項屬性賦值操作又似乎是被ignored掉了,s.len剛設置完值,再獲取,變成了undefined。why?

爲什麼字符串具有和對象相似的特徵,可以調用方法,可以設置屬性(雖然屬性似乎被忽略)?這裏一個重要的概念就是:包裝對象(wrapper object)

當對number、string、boolean這三種數據類型調用方法時候,js會先將他們轉換爲對應的包裝對象,並且這個對象是臨時的,調用完包裝對象的方法後,包裝對象隨即被丟棄。可以將包裝對象視爲技術實現底層的細節,不需要think about it;

例1裏面的過程可以由下圖表示:

包裝對象

另外,可以通過調用String()、Number()、Boolean()顯示的創建包裝對象。(雖然這很沒必要也沒啥用)。通過typeof可以清楚的基本數據類型和包裝對象的區別,基本是基本類型,對象是對象類型。

var s = "test";
var n = 1;
var b = true;
var S = new String(s);
var N = new Number(n);
var B = new Boolean(b);
typeof s; //"string"
typeof n; //"number"
typeof b; //"boolean"
typeof S; //"object"
typeof N; //"object"
typeof B; //"object"

雖然wrapper object作爲一種技術上的實現細節,不需要過多關注,但在基本數據類型具有對象表現行爲的時候,我們還是應該知道這是爲什麼?並且要牢記,基本數據類型不可以改變,so,不要犯:

a.toUpperCase();
console.log(a); //  認爲a is "HELLO",記住:基本數據類型不可以修改,a is still "hello",a is still "hello",a is still "hello"

JavaScript細節很多,容易搞暈的地方也很多,所以不要遺漏小細節,這樣才能不斷成長,我們要對自己寫的代碼負責,so,搞清楚最基礎的,雖不起眼,但很重要。



作者:佩吉秋
鏈接:https://www.jianshu.com/p/7e585f06d029
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章