[JS高程] 特殊的原始值類型

原始值包裝類型 (特殊引用類型)

在ES6 時,ECMAScript 數據類型是這樣去分類的:

  • 原始值(基本數據類型)

    • Number
    • String
    • Boolean
    • Undefined
    • Null
    • Symbol
  • 引用值(複雜數據類型)

    • Object

      函數也是一種引用類型

且我們知道,通常情況下,只有對象纔有方法。但是我們知道,實際上,字符串有字符串方法,如:

  • indexOf() , lastIndexOf()
  • search()
  • slice(), substring(), substr()
  • replace()
  • toUpperCase(), toLowerCase()
  • concat()
  • trim()
  • 等等...

Number 有Number 方法,如:

  • toExponential()
  • toFixed()
  • toPrecision()
  • 等等...

Boolean 有 Boolean 方法,如:

  • toString()
  • valueOf()

這些都是基本的數據類型, 但是卻有着對象的方法。

實際上,ECMAScript 爲了方便的操作原始值,提供了3中 特殊的引用類型 :

  1. Boolean
  2. Number
  3. String
let s1 = "some text";
let s2 = s1.substring(2);

這裏,第二行在訪問s1 的時候,是以讀模式訪問的。 也就是要從內存中讀取變量保存的值, 以讀模式訪問字符串值的任何時候,後臺都會執行以下3個步驟:

  1. 創建一個String類型的實例;
  2. 調用實例上的特定方法;
  3. 銷燬實例。
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;

布爾值和數值也是一樣的, 以上3步也會在後臺發生,不過使用的是Boolean 和 Number 包裝類型而已 。

這三種特殊的引用類型,也叫做原始值包裝類型。

原始值包裝類型和應用類型的區別

引用類型與原始包裝類型的主要區別在於對象的生命週期。 在通過new 實例化引用類型後。 得到的實例會在離開作用域時被銷燬,而自創建的原始值包裝對象則只存在於訪問它的那行代碼執行期間。 這也爲之不能在運行時給原始值添加屬性和方法。

let s1 = "some text";
s1.color = "red"; // 創建臨時String 對象,並在執行完該行後立即被銷燬。
console.log(s1.color);// undefined

不過如果真的期望達到給一個原始值添加屬性。 可以顯式的去調用 new Boolean()new Number()new String() 這些構造函數以創建原始值包裝對象。

有幾點值得注意:

  1. 不推薦使用, 因爲會讓開發者容易疑惑。

  2. 原始值包裝類型的實例上使用 typeof 會返回 "object"

    let objNumb = new Number(100);
    let objStr = new String("some text");
    let objBool = new Boolean(true);
    
    typeof objNumb; //'object'
    typeof objStr;  //'object'
    typeof objBool; //'object'
    
  3. 通過原始值包裝類型構造函數顯式的實例化對象 都是 對應原始值包裝類型的實例

    objNumb instanceof Number;	// true
    objStr instanceof String; 	// true
    objBool instanceof Boolean;	// true
    
  4. 通過工廠方法 Object構造函數,也能夠根據傳入值的類型返回相應原始值包裝類型的實例

    let Ostr = new Object("some text");
    let Onum = new Object(100);
    let Obool = new Object(false);
    
    Ostr instanceof String;		// true
    Onum instanceof Number;		// true
    Obool instanceof Boolean;	// true
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章