1. 單例內置對象
所謂單例內置對象,是指由ECMAScript 實現提供的對象,與宿主環境無關。 不用顯式的實例化內置對象。處理常見的Object、Array、String , 還有兩個單例內置對象,Global 和 Math。
1.2 Global
事實上,不存在全局變量或者全局函數這種東西。 在全局作用域中定義的變量和函數都會變成Global對象的屬性。
1.2.1 常見的Global 對象方法
常見的有 :
isNaN()
isFinate()
parseInt()
parseFloat()
除此外,還有:
-
URL編碼方法
-
encodeURI()
-
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後面的字符串。 -
-
URL解碼方法
-
decodeURI()
-
decodeURIComponent()
decodeURI()
只對使用encodeURI()
編碼過的字符解碼,decodeURIComponent()
解碼所有被encodeURIComponent()
編碼過的字符。
-
-
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
對象的屬性。 此外, 所有原生引用類型構造函數,比如Object
, Function
, Boolean
, 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
對象有大量關於數學計算的方法。 這裏僅提及少數常用方法。
-
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);
-
舍入方法
-
Math.ceil()
: 始終向上舍入爲最接近的整數Math.ceil(25.9);//26 Math.ceil(25.1);///26
-
Math.floor()
:始終向下舍入爲最接近的整數Math.floor(25.9);//25 Math.floor(25.1);//25
-
Math.round()
: 執行四捨五入Math.round(25.9);//26 Math.round(25.1);//25
-
Math.fround()
: 返回數值最接近的單精度(32位)浮點值表示。Math.fround(0.4); // 0.4000000059604645 Math.fround(0.5); // 0.5 Math.fround(25.9); // 25.899999618530273
-
-
random()
方法Math.random()
方法返回一個 0~1 範圍的隨機數。 注意: 包括0, 但不包括1。 -
其他方法,還有很多方法
Math.abs(x)
: 返回x的絕對值。Math.pow(a,b)
: 返回 a 的 b 次方Math.sqrt(x)
: 返回 x 的平方根- 等等....
小結:
當代碼開始執行時,全局上下文中會存在兩個內置對象: Global 和 Math。 其中,Global 對象在大多數ECMAScript 實現中無法直接訪問。 不過,瀏覽器將其實現爲window 對象。 所有全局變量和函數都是Global 對象的屬性。 Math 對象包含輔助玩策劃給複雜計算的屬性和方法。