JavaScript 中的單例內置對象Global 與 Math
前言
ECMA-262 對內置對象的定義是“任何由ECMAScript實現提供,與宿主環境無關,並在ECMAScript 程序開始執行時就存在的對象”。這意味著,開發者不用顯示的實例化內置對象,因為他們已經實例化 好瞭。
Global
Global 對象是ECMAScript 中最特別的對象,因為代碼不會顯示的訪問它。ECMA-262 規定Global 對象為一種兜底對象,他所針對的是不屬於任何對象的屬性和方法。事實上,不存在全局變量或全局函數這種東西。在全局作用域中定義的變量和函數都會變成Global對象的屬性。包括isNaN(),isFinite(),parseInt()和parseFloat(),實際上都是Global對象的方法。除瞭這些,Global 對象上還有另外一些方法。
1.URL編碼方法
encodeURI()和encodeURIComponent()方法用於編碼統一資源標識符(URI),以便傳給瀏覽器。有效的URI不能包含某些字符,比如空格。使用URI編碼方法來編碼URI可以讓瀏覽器能夠理解它們,同時又以特殊的UTF—8 編碼替換掉所有無效字符。encodeURI()方法用於對整個URI進行編碼,比如"www.wrox.com/illegal value.js".而encodeURIComponent()方法用於編碼URI中單獨的組件,比如前面URL 中的"illegal value.js"。這兩個方法的主要區別是,encodeURI 不會編碼屬於URL組件的 特殊字符,如冒號,斜杠,問號,井號,二encodeURI Component()會編碼他發現的所有非標準字符。
let uri = "http://www.wrox.com/illegal value.js#start"; //http://www.wrox.com/illegal%20value.js#start console.log(encodeURI(uri)); //http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start console.log(encodeURIComponent(uri));
這裡使用encodeURI()編碼後,除空格被替換為%20之外,沒有任何變化。而encodeURIComponent()方法將所有非字母字符都替換成瞭相應的編碼形式。這就是使用encodeURI編碼整個URI,但隻使用encodeURIComponent()編碼那些會追加到已有URI後面的字符串的原因。
與encodeURI() 和 encodeURIComponent()相對的是decodeURI()和decodeURIComponent().decodeURI()隻對使用encodeURI()編碼過的字符解碼。例如,%20會被退換為空格,但%23不會被替換為井號(#),因為井號不是由encodeURI()替換的。類似的,decodeURIComponent()解碼所有被encodeURIComponent()編碼的字符,基本上就是解碼所有特殊值。
let uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"; //http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start console.log(decodeURI(uri)); //http://www.wrox.com/illegal value.js#start console.log(encodeURIComponent(uri));
2.eval()方法
eval()方法可以說是ECMAScript語言中最強大的。這個方法就是一個完整的ECMAScript解析器,它接收一個參數,即一個要執行的ECNAScript(JavaScript)字符串。
當解釋器發現eval()調用時,會將參數解釋為實際的ECMAScript 語句,然後將其插入該位置。
通過eval()執行的代碼屬於該調用所在上下文,被執行的代碼與該上下文擁有相同的作用域鏈。
通過eval()定義的任何變量和函數都不會被提升,這是因為在解析代碼的時候,它們是被包含在一個字符串中。 由於eval()的風險性,大部分時間不會使用這個函數。
3.Gobal對象屬性
Gobal 對象由很多屬性,其中一些前面已經提到過瞭。像undefined,NaN和Infinity等特殊值都是Global 對象的屬性。此外,所有原生引用類型構造函數,比如Object和Function,也都是Gobal 對象的屬性。下表列出瞭Global對象的屬性。
屬性 | 說明 |
---|---|
undefined | 特殊值undefined |
NaN | 特殊值NaN |
Infinity | 特殊值Infinity |
Object | Object的構造函數 |
Array | Array的構造函數 |
Function | Function的構造函數 |
Boolean | Boolean的構造函數 |
String | String 的構造函數 |
Number | Number 的構造函數 |
Date | Date的構造函數 |
RegExp | RegExp的構造函數 |
Symbol | Symbol的偽構造函數 |
Error | Error 的構造函數 |
EvalError | EvalError 的構造函數 |
RangeError | RangeError的構造函數 |
SyntaxError | SyntaxError的構造函數 |
TypeError | TypeError的構造函數 |
URIError | URIError的構造函數 |
4.window 對象
雖然ECMA-262 沒有規定 直接訪問Global 對象的方式,但瀏覽器將window對象實現為Global對象的代理。因此全局作用域中的變量和函數都變成瞭window對象的屬性。
var color = "red"; function sayColor() { cosole.log(window.color); } window.sayColor();// “red”
另外一種獲取Global 對象的方式是使用如下的代碼:
let global = function () { return this; }();
這段代碼創建一個立即調用的函數表達式,返回瞭this的值。當一個函數沒有明確(通過稱為某個對象的方法,或者通過call()/apply())指定this值的情況下執行時,this值等於Global 對象。
Math
ECMAScript 提供瞭Math 對象作為保存數學公式,信息和計算的地方。Math對象提供瞭一些輔助計算的屬性和方法。
Math對象上提供的計算要比直接在JavaScript 實現的快的多,因為Math 對象上的計算使用瞭JavaScript 引擎中更高效的實現和處理器指令。但使用Math計算的問題時精確度會因瀏覽器,操作系統,指令集和硬件而異。
1.Math 對象屬性
屬性 | 說明 |
---|---|
Math.E | 自然對數的基數e的值 |
Math.LN10 | 10為底的自然數對 |
Math.LN2 | 2為底的自然對數 |
Math.LOG2E | 以2為底e的對數 |
Math.LOG10E | 以10為底e的對數 |
Math.PI | pi的值 |
Math.SQRT1_2 | 1/2的平方根 |
Math.SQRT2 | 2的平方根 |
2.min()和max()方法
Math對象也提供瞭很多付諸執行簡單或復雜數據計算的方法。 min()和max()方法用於確定一組數值中的最小值和最大值。這兩個方法接收任意多個參數。
let max = Math.max(3,54,32,16); console.log(max); // 54 let min = Math.min(3,54,32,16); console.log(min);//3
要知道數組中的最大值和最小值,可以像下面這樣使用拓展操作符:
let values = [1,2,3,4,5,5,6,7,8]; let max = Math.max(...values);// 8
3.舍入方法 Math.ceil(),Math.floor(),Math.round(),Math.fround()
Math.ceil(),Math.floor(),Math.round(),Math.fround() 是把小數舍入為整數的4個方法。
Math.ceil()方法始終向上舍入為最接近的整數。
Math.floor() 方法始終向下舍入為最接近的整數。
Math.round() 方法執行四舍五入。
Math.fround()方法返回數值最接近的單精度(32位)浮點值表示。
console.log(Math.ceil(25.9));// 26 console.log(Math.ceil(25.5));// 26 console.log(Math.ceil(25.1));// 26 console.log(Math.round(25.9));// 26 console.log(Math.round(25.5));// 26 console.log(Math.round(25.1));// 25 console.log(Math.fround(0.4));//0.4000000059604645 console.log(Math.fround(0.5));// 0.5 console.log(Math.fround(25.9));// 25.899999618530273 console.log(Math.floor(25.9));// 25 console.log(Math.floor(25.5));// 25 console.log(Math.floor(25.1));// 25
random()方法
Math.random()方法返回一個0~1范圍內的隨機數,其中包含0 但不包含1。可以基於一下公式使用Math.random()從一組整數種隨機選擇一個數:
number = Math.floor(Math.random() * totoal_number_of_choices + first_possible_value)
這裡使用瞭Math.floor()方法,因為Math.random()始終返回小數,即便成一個數再加上一個數也是小數。因此,如果想從1~10范圍內隨機選擇一個數,代碼就是這樣的
let num = Math.floor(Math.random() * 10 + 1);
可以通過下面的通用函數計算出可選總數和最小可能的值:
function selectFrom(lowerValue,upperValue){ let choices = upperValue - lowerValue + 1; return Math.floor(Math.random() * choices + lowerValue); } let num = selectFrom(2,10); console.log(2,10);
Math的其他方法
方法 | 說明 |
---|---|
Math.abs(x) | 返回x的絕對值 |
Math.exp(x) | 返回Math.E的x次冪 |
Math.expm1(x) | 等於Math.exp(x) -1 |
Math.log(x) | 返回x的自然對數 |
Math.log1p | 等於1 + Math.log(x) |
Math.pow(x,power) | 返回x的power次冪 |
Math.hypot(..nums) | 返回nums中每個數平方和的平方根 |
Math.clz32(x) | 返回32位整數x的前置零的數量 |
Math.sign(x) | 返回x符號的1,0,-0或 -1 |
Math.trunc(x) | 返回x的整數部分,刪除所有小數 |
Math.sqrt(x) | 返回x的平方根 |
Math.cbrt(x) | 返回x的立方根 |
Math.acos(x) | 返回x的反餘弦 |
Math.acosh(x) | 返回x的反雙曲餘弦 |
Math.asin(x) | 返回x的反正弦 |
Math.asinh(x) | 返回x的反雙曲正弦 |
Math.atan(x) | 返回x的反正切 |
Math.atanh(x) | 返回x的反雙曲正切 |
Math.atan2(y,x) | 返回y/x的反正切 |
Math.cos(x) | 返回x的餘弦 |
Math.sin(x) | 返回x的正弦 |
Math.tan(x) | 返回x的正切 |
到此這篇關於JavaScript 中的單例內置對象Global 與 Math的文章就介紹到這瞭,更多相關JavaScript 單例內置對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript高級程序設計之基本引用類型
- JavaScript數據結構Number
- javascript Number 與 Math對象的介紹
- JavaScript內置對象Math與String詳細介紹
- 深入理解JavaScript 變量對象