1. 程式人生 > >JavaScript內建物件--單體內建物件(Global、Math)詳解

JavaScript內建物件--單體內建物件(Global、Math)詳解

一、什麼是單體內建物件?

官方對於"單體"二字其實沒有顯性的表達,看了很多書籍和大牛的網站,都是含糊兩口,其實就我自己也沒完全搞清楚這個幾個名詞,“引用型別”,“單體”內建物件,"內建物件"這些詞的區別,按介紹說,內建物件是不依賴於宿主環境的物件,這些物件在程式執行之前就已經存在了,開發人員不必顯示地例項化內建物件,因為它們已經例項化了。 簡而言之,單體內建物件是不需要通過new來例項化的,例如我們的string可以new,但是Math是不要new的,因為可以直接使用Math的API。

Global類

Global物件是JavaScript中最特別的一個物件。不屬於任何其他物件的屬性和方法,最終都是它的屬性和方法。實際上,沒有全域性變數或全域性作用域,所有在全域性作用域中定義的屬性和函式,都是Global物件的屬性。
一、URI編碼方法 1.encodeURI()/encodeURIComponent() : 這兩個方法用於對URI進行編碼,有效的URI中不能包含某些字元,例如空格。他們用特殊的UTF-8編碼替換所有無效的字元,從而讓瀏覽器能夠接受和理解。 encodeURI(): 這個方法用於整個URI(例如,http://www.wrox.com/illegal  value.html)進行編碼 encodeURIComponent() : 這個方法只對URI中的每一段(例如: illegal  value.html)進行編碼 這兩個方法的區別是:encodeURI()不會對本身屬於URI的特殊字元進行編碼,例如冒號、正斜槓、問號、井字號
encodeURIComponent()則會對它發現的任何非標準字元進行編碼 var uri = "http://www.wrox.com/illegal value.html#start"; //"http://www.wrox.com/illegal%20value.html#start"   空格變成了%20
console.log(encodeURI(uri));    //"http%3A%2F%2Fwww.wrox.com%2illegal%20value.html%23start"  冒號、正斜槓、問號、井字號都被轉碼
console.log(encodeURIComponent(uri));  

2.decodeURI()與decodeURIComponent() : 這兩個方法是與encodeURI()/encodeURIComponent()對應的兩個方法,是對這兩個方法進行解碼,decodeURI()只能對encodeURI()解碼,decodeURIComponent()只能對encodeURIComponent()解碼 二、eval()方法 eval()方法支接收一個引數,即要執行的JavaScript字串,舉個例子: eval(alert("hello")); 這段程式碼的執行結果等同於alert("hello") 當解析器呼叫eval()方法時,會將傳入的引數作為實際的JavaScript語句解析,然後將執行結果插入原來的位置。通過eval()執行的程式碼被認為是包含該次呼叫的執行環境的一部分,因此被執行的程式碼具有與該執行環境相同的作用域鏈。這意味著通過eval()執行的程式碼可以引用在包含環境中定義的變數,舉個例子: var msg="hello world"; eval("alert(msg)");   //"hello world" 可見,變數msg是在eval()呼叫的環境之外定義的,但其中呼叫的alert()仍然能夠顯示"hello world" 同樣地,可以在eval()中定義一個函式,然後再在該呼叫的外部引用這個函式:
eval("function sayHi(){ alert ("h1")}");  sayHi(); 函式sayHi()是在eval()內部定義的,但由於對eval()的呼叫最終會被替換成定義函式的實際程式碼。 注意:在eval()中建立的任何變數或函式都不會被提升,在解析程式碼時,它們被包含在一個字串中;只有在eval()執行時才建立。
三、window物件 JavaScript沒有指出如何直接訪問Global物件,但是web瀏覽器都是將它作為window物件的一部分加以實現的。因此,在全域性作用域中宣告的所有變數和函式,都稱為window物件的屬性。
var color="red"; function sayColor(){ alert(window.color); } window.sayColor(); //"red" 上面定義了一個全域性變數color和全域性函式sayColor()方法,在函式內部通過window.color來訪問color變數,說明全域性變數color是window物件的屬性。然後通過window.sayColor()來呼叫sayColor()方法,說明sayColor()是window物件的方法。
另一種取得Global物件的方法是使用以下程式碼: var global = function(){ return this; }(); this的值等於Global物件

Math類

Math物件是專門封裝數學計算的常量和API的物件,不能new,直接使用!! 一、Math物件的屬性
最常使用到的無非就是Math.PI了 二、min()和max()方法 min()和max()方法用於確定一組數值中的最小值和最大值。 var max=Math.max(3,54,32,16); console.log(max);    //54 var min=Math.min(3,54,32,16); console.log(min);   //3 三、舍入方法 Math.ceil() : 執行向上舍入,它總將數值向上舍入為最接近的整數 Math.floor() : 執行向下舍入,它總將數值向下舍入為最接近的整數 Math.round() : 執行四捨五入,它總將數值四捨五入為最接近的整數 console.log(Math.ceil(25.9)); //26 console.log(Math.ceil(25.5)); //26
console.log(Math.ceil(25.1)); //26
console.log(Math.floor(25.9));   //25
console.log(Math.floor(25.5));   //25
console.log(Math.floor(25.1));  //25
console.log(Math.round(25.9));   //26
console.log(Math.round(25.5));   //26
console.log(Math.round(25.1));  //25
舍入的比較: 1. Math.ceil()/Math.floor()    VS    str.parseInt() 前者的引數是number,且必須用Math呼叫,而且不能去掉以字串結尾的非數字字元 後者的引數是string,是專門用來去掉字元結尾的非數字字元 那問題來了,如果遇到"25.67abc" 我們該怎麼轉換為整數數字? 首選使用parseFloat var text = parseFloat("25.67abc"); console.log(text);   //26 2.Math.round()     VS   toFixed() 前者必須用Math呼叫,且只能取整數,返回值是一個number,可以直接算數計算 後者可以被任何數字型別的值呼叫,返回值是一個string,要先轉換為number在來計算 四、 Math.random()方法 Math.random() : 返回值是一個大於等於0小於1的一個隨機數,這個方法經常在開發中使用,專門用來隨機生產一個數字的方法 公式: 值 = Math.floor(Math.random()*可能值的總數+第一個可能的值) 使用Math.floor的原因是因為Math.random() 總返回一個小數值 舉個例子,如果你想選取1~10之間的數值,可以這樣寫: var num = Math.floor(Math.random()*10+1); 總共有10個可能的值,而第一個可能是1。 如果想要一個介於2~10之間的數值,可以這樣寫: var  num =Math.floor(Math.random()*9+2); 總共有9個可能的值,而第一個可能是2。 五、其他方法 Math物件中還包含了一些與完成各種簡單或複雜計算有關的方法:
三角函式相關的方法: