Global對象
Global(全局)對象可以說是 ECMAScript 中最特別的一個對象了,因為不管你從什么角度上看,這個對象都是不存在的。
ECMAScript 中的 Global 對象在某種意義上是作為一個終極的"兜底兒對象"來定義的。
換句話說,不屬于任何其他對象的屬性和方法,最終都是它的屬性和方法。
事實上沒有全局變量或全局函數;所有在全局作用域中定義的屬性和函數,都是 Global 對象的屬性。
例如:isNan()、isFinite()、parseInt()...等,除此之外,Global 對象還包含其他一些方法。
URI編碼方法
encodeURI() 和 encodeURIComponent() 方法可以對 URI(Uniform Resource Identifiers,通用資源表示符)進行編碼,以便發(fā)送給瀏覽器。有效的 URI 中不能包含某些字符,例如空格。而這兩個 URI 編碼方法就可以對 URI 進行編碼,它們用特殊的 UTF-8 編碼替換所有無效的字符,從而讓瀏覽器能夠接受和理解。
encodeURI() 主要用于整個 URI(例如,http://www.xxx.com/iii.html), 而 encodeURIComponent() 主要用于對 URI 中的某一段(例如前面 URL 中的 xxx.html)進行編碼。
它們的主要區(qū)別在于, encodeURI() 不會對本身屬于 URI 的特殊字符進行編碼,例如冒號、正斜杠、問好和井字號;
而 encodeURIComponent() 則會對它發(fā)現的任何非標準字符進行編碼。
var uri = "http://www.xxx.com/iii.html";
alert(encodeURI(uri)); // http://www.xxx.com/iii.html
alert(encodeURIComponent(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html
使用 encodeURI() 編碼后的結果是除了空格之外的其他字符都原封不動,只有空格被替換成了 %20。而encodeURIComponent() 方法則會使用對應的編碼替換所有非字符字母字符串。
一般來說,我們使用 encodeURIComponent() 方法的時候要比使用 encodeURI() 更多,因為在實踐中更常見的是對查詢字符串參數而不是對基礎 URI 編碼
與 encodeURI() 和 encodeURIComponent() 方法對應的兩個方法分別是 decodeURI() 和 decodeURIComponent()。其中, decodeURI() 只能堆使用 encodeURI() 替換的字符進行解碼。 decodeURIComponent() 能夠解碼使用 encodeURIComponent() 編碼的所有字符,即它可以解碼任何特殊字符的編碼。
var uri = "http%3A%2F%2Fwww.xxx.com%2Fiii.html";
alert(decodeURI(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html
alert(decodeURIComponent(uri)); // http://www.xxx.com/iii.html
URI 方法 encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent() 用于代替已經被 ECMA-262第三版飛起的 escape() 和 unescape() 方法。
URI 方法能夠編碼所有 Unicode 字符,而原來的方法只能正切地編碼 ASCLL 字符。因此在開發(fā)實踐中,特別是在產品級的代碼中,一定要使用 URI 方法,不要使用 escape() 和 unescape() 方法。
eval() 方法
eval() 方法就像是一個完整的 ECMAScript 解析器,它只接受一個參數,即要執(zhí)行的 ECMAScript (或 JavaScript) 字符串。
eval("alert('hi')");
這段代碼的作用等價于下面這行代碼:
alert("hi");
當解析器發(fā)現代碼中調用 eval() 方法時,他會將傳入的參數當做實際的 ECMAScript 語句來解析, 然后把執(zhí)行結果插入到原位置。
通過 eval() 執(zhí)行的代碼被認為是包含該次調用的執(zhí)行環(huán)境的一部分,因此被執(zhí)行的代碼具有與該執(zhí)行環(huán)境相同的作用域鏈。
這意味著通過 eval() 執(zhí)行的代碼可以引用在包含環(huán)境中定義的變量。
var msg = "hello world";
eval("alert(msg)"); // hello world
eval("function sayHi() { alert('hi'); }");
sayHi()
嚴格模式下,在外部訪問不到 eval() 中創(chuàng)建的任何變量或函數,因此上面例子都會導致錯誤。同樣,在嚴格模式下,為 eval() 賦值也會導致錯誤:
"use strict"
eval = "hi" // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
能夠解釋代碼字符串的能力非常強大,但也非常危險。
因此在使用 eval() 時必須謹慎,特別是用在執(zhí)行用戶輸入的數據的情況下。
否則,可能會有惡意用戶輸入威脅你的站點或應用程序安全的代碼(即所謂的代碼注入)
Global對象的屬性
Global 對象還包含一些屬性,例如,特殊的值 undefined、 NaN 以及 Infinity 都是 Global 對象的屬性。 此外,所有原生引用類型的構造函數,像 Object 和 Function,也都是 Global 對象的屬性。
| 屬性 | 說明 | 屬性 | 說明 |
|---|---|---|---|
| undefined | 特殊值 undefined | Date | 構造函數 Date |
| Nan | 特殊值 Nan | RegExp | 構造函數 RegExp |
| Infinity | 特殊值 Infinity | Error | 構造函數 Error |
| Object | 構造函數 Object | EvalError | 構造函數 EvalError |
| Array | 構造函數 Array | RangeError | 構造函數 RangeError |
| Function | 構造函數 Function | ReferenceError | 構造函數 ReferenceError |
| Boolean | 構造函數 Boolean | SyntaxError | 構造函數 SyntaxError |
| String | 構造函數 String | TypeError | 構造函數 TypeError |
| Number | 構造函數 Number | URIError | 構造函數 URIError |
ECMAScript 5 明確禁止給 undefined、NaN 和 Infinity 賦值,這樣做即使在非嚴格模式下也會導致錯誤。
window 對象
ECMAScript 雖然沒有指出如何直接訪問Global 對象,但 Web瀏覽器都是講這個全局對象作為 window 對象的一部分加以實現的。因此,在全局作用域中聲明的所有變量和函數,就都成為了 window 對象的屬性。
var color = "red";
function sayColor() {
alert(window.color);
}
window.sayColor(); // red
在 sayColor() 內部,通過 window.color 來訪問 color 變量,說明變量是 window 對象的屬性。
使用 window.sayColor() 來直接通過 window 對象調用這個函數,說明 sayColor() 也是綁定在 window 對象下的。
var global = function() {
return this;
}
通過簡單地返回 this 來取得 Global 對象,在任何環(huán)境下都是可行的。
Math對象
ECMAScript 還為保存數學公式和信息提供了一個公共位置,即 Math 對象。Math 對象提供了復制完成計算的屬性和方法。
Math 對象的屬性
| 屬性 | 說明 |
|---|---|
| Math.E | 自然對數的底數,即常亮e的值 |
| Math.LN10 | 10的自然對數 |
| Math.LN2 | 2的自然對數 |
| Math.LOG2E | 以2為底e的對數 |
| Math.LOG10E | 以10為底e的對數 |
| Math.PI | π的值 |
| Math.SQRT1_2 | 1/2的平方根(即2的平方根的倒數 |
| Math.SQRT2 | 2的平方根 |
min() 和 max() 方法
確定一組數值中的最小值和最大值
var max = Math.max(3, 54, 32, 16);
alert(max); // 54
var min = Math.min(3, 54, 32, 16);
Alert(min); // 3
要找到數組中的最大或最小值可以使用下面方法:
var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);
alert(max) // 8
舍入方法
將小數舍入為整數的方法:
- Math.ceil() 執(zhí)行向上舍入,即它總是將數值向上舍入為最接近的整數;
- Math.floor() 執(zhí)行向下舍入,即它總是將數值向下舍入為最接近的整數;
- Math.round() 執(zhí)行標準舍入,即它總是將數值四舍五入為最接近的整數;
alert(Math.ceil(25.9)); //26
alert(Math.ceil(25.5)); //26
alert(Math.ceil(25.1)); //26
alert(Math.round(25.9)); // 26
alert(Math.round(25.5)); // 26
alert(Math.round(25.1)); // 25
alert(Math.floor(25.9)); // 25
alert(Math.floor(25.5)); // 25
alert(Math.floor(25.1)); // 25
random() 方法
Math.random() 方法返回介于 0 和 1 之間一個隨機數,不包括 0 和 1.
Math.random() 可以用于隨機顯示一些名人名言或新聞事件。
值 = Math.floor(Math.random()) * 可能值的總數 + 第一個可能的值)
公式中用到了 Math.floor() 方法,這是因為 Math.random() 總返回一個小數值。而用這個小數值乘以一個整數,然后在加上一個整數,最終結果仍然還是一個小數。
如果想選擇一個 1 到 10 之間的數值,可以像下面例子這樣實現:
var num = Math.floor(Math.random() * 10 + 1);
如果想要選擇一個介于 2 到 10 之間的值:
var num = Math.floor(Math.random() * 9 + 2);
從 2 數到 10 要數9個數,因此可能值的總數就是 9,而第一個可能的值就是 2.多數情況下,其實都可以通過一個函數來計算可能值的總數和第一個可能值:
function selectFrom(lowerValue, upperValue) {
var choices = upperValue - lowerValue + 1;
return Math.floor(Math.random() * choices + lowerValue);
}
var num = selectFrom(2, 10);
alert(num); // 介于 2 和 10 之間(包括 2 和 10)的一個數值
// 利用這個函數,可以方便地從數組中隨機取出一項
var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length - 1)];
alert(color);
其他方法
Math 對象中還包含其他一些與完成各種簡單或復雜計算有關的方法:
| 方法 | 說明 | 方法 | 說明 |
|---|---|---|---|
| Math.abs(num) | 返回num的絕對值 | Math.asin(x) | 返回x的反正炫值 |
| Math.exp(num) | 返回Math.E的num次冪 | Math.atan(x) | 返回x的反正切值 |
| Math.log(num) | 返回num的自然對數 | Math.atan2(y, x) | 返回y/x的反正切值 |
| Math.pow(num) | 返回num的power次冪 | Math.cos(x) | 返回x的余弦值 |
| Math.sqrt(num) | 返回num的平方根 | Math.sin(x) | 返回x的正炫值 |
| Math.acos(x) | 返回num的反余弦值 | Math.tan(x) | 返回x的正切值 |