[JS高程] 單例內置對象

1. 單例內置對象

所謂單例內置對象,是指由ECMAScript 實現提供的對象,與宿主環境無關。 不用顯式的實例化內置對象。處理常見的Object、Array、String , 還有兩個單例內置對象,Global 和 Math。

1.2 Global

事實上,不存在全局變量或者全局函數這種東西。 在全局作用域中定義的變量和函數都會變成Global對象的屬性。

1.2.1 常見的Global 對象方法

常見的有 :

  • isNaN()
  • isFinate()
  • parseInt()
  • parseFloat()

除此外,還有:

  1. URL編碼方法

    1. encodeURI()

    2. encodeURIComponent()

      encodeURI()方法會將URI 中空格轉譯:

      let uri = "http://www.wrox.com/illegal value.js#start";
      console.log(encodeURI(uri));
      // "http://www.wrox.com/illegal%20value.js#start" 
      

      encodeURIComponent() 方法則會編碼所有它發現的非標準字符。

      console.log(encodeURIComponent(uri)); 
      // "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start" 
      

    通常的做法是使用encodeURI() 去編碼整個URI, 但是,只使用encodeURLComponent() 去編譯哪些會追加到以後URI後面的字符串。

  2. URL解碼方法

    1. decodeURI()

    2. decodeURIComponent()

      decodeURI() 只對使用encodeURI() 編碼過的字符解碼,decodeURIComponent() 解碼所有被encodeURIComponent() 編碼過的字符。

  3. eval() 方法

    這個方法是一個完整的ECMAScript解釋器, 它接受一個參數,一個ECMAScript 字符串。

    eval("console.log('hi')");
    //等價於
    console.log("hi")
    

    通過eval() 方法執行的代碼屬於該調用所在的上下文,被執行的代碼與該上下文擁有相同的作用域鏈。 這意味着定義在包含上下文中的變量可以在eval() 調用內部被引用。

    let msg = "hello world";
    eval("console.log(msg)"); // "hello world"
    

    通過eval()定義的任何變量和函數都不會被提升, 這是因爲在解析代碼的時候,他們是被包含在一個字符串中的。他們只是在eval() 執行的時候纔會被創建。

    嚴格模式下,eval() 內部創建的變量和函數無法被外部訪問。

1.2.2 Global 對象屬性

特殊值如undefined, NaN, Infinity 等,都是Global 對象的屬性。 此外, 所有原生引用類型構造函數,比如ObjectFunctionBoolean , String, Number 等等,都是Global 對象的屬性。

下表列出了所有這些屬性,

屬性 說明
undefined 特殊值
NaN 特殊值
Infinity 特殊值
Object 構造函數
Array 構造函數
Function 構造函數
Boolean 構造函數
String 構造函數
Number 構造函數
Date 構造函數
RegExp 構造函數
Symbol 構造函數
Error 構造函數
EvalError 構造函數
RangeError 構造函數
ReferenceError 構造函數
SyntaxError 構造函數
TypeError 構造函數
URIError 構造函數

以上這些對象屬性,很多都非常熟悉,但是通常只知道是window 對象提供的。 這是因爲window 對象實際上是Global 對象的代理。 而ECMAScript 並沒有規定直接方位Global 對象的方式。

在瀏覽器爲宿主環境中:

this === window
window === globalThis
this === globalThis

注意以上判斷不能簡寫爲this === window === globalThis

因爲this === window 返回 true ,但是 true 並不全等於globalThis

在node環境中

this === globalThis

1.2.3 window 對象

window 對象 在 JavaScript 中遠遠不止實現了ECMAScript 的 Global 對象那麼簡單。 這裏不做詳細介紹 高程12章有詳解。

1.3 Math

單例內置對象除了Global 之外,還有一個就是Math

1.3.1 對象屬性

Math 對象有一些屬性,用於保存數學中的一些特殊值 如Math.PI , Math.E 等 。 這裏略。

1.3.2 常用對象方法

Math 對象有大量關於數學計算的方法。 這裏僅提及少數常用方法。

  1. min()max() 方法

    //eg1:
    let max = Math.max(2,43,32,14);// 54
    //eg2:
    let values = [1,2,3,4,5,5,6,7,8];
    let max2 = Math.max(...values);
    
  2. 舍入方法

    1. Math.ceil() : 始終向上舍入爲最接近的整數

      Math.ceil(25.9);//26
      Math.ceil(25.1);///26
      
    2. Math.floor() :始終向下舍入爲最接近的整數

      Math.floor(25.9);//25
      Math.floor(25.1);//25
      
    3. Math.round() : 執行四捨五入

      Math.round(25.9);//26
      Math.round(25.1);//25
      
    4. Math.fround() : 返回數值最接近的單精度(32位)浮點值表示。

      Math.fround(0.4);  // 0.4000000059604645 
      Math.fround(0.5);  // 0.5 
      Math.fround(25.9); // 25.899999618530273
      
  3. random() 方法

    Math.random() 方法返回一個 0~1 範圍的隨機數。 注意: 包括0, 但不包括1

  4. 其他方法,還有很多方法

    • Math.abs(x) : 返回x的絕對值。
    • Math.pow(a,b) : 返回 a 的 b 次方
    • Math.sqrt(x) : 返回 x 的平方根
    • 等等....

小結:

當代碼開始執行時,全局上下文中會存在兩個內置對象: Global 和 Math。 其中,Global 對象在大多數ECMAScript 實現中無法直接訪問。 不過,瀏覽器將其實現爲window 對象。 所有全局變量和函數都是Global 對象的屬性。 Math 對象包含輔助玩策劃給複雜計算的屬性和方法。

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