JavaScript 單體內置對象

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的正切值
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容