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!

推薦閱讀: