亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

《JavaScript 闖關(guān)記》之單體內(nèi)置對(duì)象

antyiwei / 756人閱讀

摘要:?jiǎn)误w內(nèi)置對(duì)象對(duì)內(nèi)置對(duì)象的定義是由實(shí)現(xiàn)提供的不依賴(lài)于宿主環(huán)境的對(duì)象,這些對(duì)象在程序執(zhí)行之前就已經(jīng)存在了。還定義了兩個(gè)單體內(nèi)置對(duì)象和。此外,所有原生引用類(lèi)型的構(gòu)造函數(shù),像和,也都是對(duì)象的屬性。

單體內(nèi)置對(duì)象

ECMA-262 對(duì)內(nèi)置對(duì)象的定義是「由 JavaScript 實(shí)現(xiàn)提供的、不依賴(lài)于宿主環(huán)境的對(duì)象,這些對(duì)象在 JavaScript 程序執(zhí)行之前就已經(jīng)存在了」。意思就是說(shuō),開(kāi)發(fā)人員不必顯式地實(shí)例化內(nèi)置對(duì)象,因?yàn)樗鼈円呀?jīng)實(shí)例化了。前面我們已經(jīng)介紹了大多數(shù)內(nèi)置對(duì)象,例如 ObjectArrayString。ECMA-262 還定義了兩個(gè)單體內(nèi)置對(duì)象:GlobalMath

Global 對(duì)象

Global 對(duì)象可以說(shuō)是 JavaScript 中最特別的一個(gè)對(duì)象了,因?yàn)椴还苣銖氖裁唇嵌壬峡?,這個(gè)對(duì)象都是不存在的。Global 對(duì)象在某種意義上是作為一個(gè)終極的「兜底兒對(duì)象」來(lái)定義的。換句話(huà)說(shuō),不屬于任何其他對(duì)象的屬性和方法,最終都是它的屬性和方法。所有在全局作用域中定義的屬性和函數(shù),都是 Global 對(duì)象的屬性。本書(shū)前面介紹過(guò)的那些函數(shù),諸如 isNaN()、isFinite()parseInt() 以及 parseFloat(),實(shí)際上全都是 Global 對(duì)象的方法。除此之外,Global 對(duì)象還包含其他一些方法。

URI 編碼方法

Global 對(duì)象的 encodeURI()encodeURIComponent() 方法可以對(duì) URI(Uniform Resource Identifiers,通用資源標(biāo)識(shí)符)進(jìn)行編碼,以便發(fā)送給瀏覽器。有效的 URI 中不能包含某些字符,例如空格。而這兩個(gè) URI 編碼方法就可以對(duì) URI 進(jìn)行編碼,它們用特殊的 UTF-8 編碼替換所有無(wú)效的字符,從而讓瀏覽器能夠接受和理解。

其中,encodeURI() 主要用于整個(gè) URI,而 encodeURIComponent() 主要用于對(duì) URI 中的某一段進(jìn)行編碼。它們的主要區(qū)別在于,encodeURI() 不會(huì)對(duì)本身屬于 URI 的特殊字符進(jìn)行編碼,例如冒號(hào)、正斜杠、問(wèn)號(hào)和井字號(hào);而 encodeURIComponent() 則會(huì)對(duì)它發(fā)現(xiàn)的任何非標(biāo)準(zhǔn)字符進(jìn)行編碼。來(lái)看下面的例子。

var uri = "http://shijiajie.com/illegal value.htm#start";

console.log(encodeURI(uri));
// "http://shijiajie.com/illegal%20value.htm#start"

console.log(encodeURIComponent(uri));
// "http%3A%2F%2Fshijiajie.com%2Fillegal%20value.htm%23start"

使用 encodeURI() 編碼后的結(jié)果是除了空格之外的其他字符都原封不動(dòng),只有空格被替換成了 %20。而 encodeURIComponent() 方法則會(huì)使用對(duì)應(yīng)的編碼替換所有非字母數(shù)字字符。這也正是可以對(duì)整個(gè) URI 使用 encodeURI(),而只能對(duì)附加在現(xiàn)有 URI 后面的字符串使用 encodeURIComponent() 的原因所在。

一般來(lái)說(shuō),我們使用 encodeURIComponent() 方法的時(shí)候要比使用 encodeURI() 更多,因?yàn)樵趯?shí)踐中更常見(jiàn)的是對(duì)查詢(xún)字符串參數(shù)而不是對(duì)基礎(chǔ) URI 進(jìn)行編碼。

encodeURI()encodeURIComponent() 方法對(duì)應(yīng)的兩個(gè)方法分別是 decodeURI()decodeURIComponent()。其中,decodeURI() 只能對(duì)使用 encodeURI() 替換的字符進(jìn)行解碼。例如,它可將 %20 替換成一個(gè)空格,但不會(huì)對(duì) %23 作任何處理,因?yàn)?%23 表示井字號(hào) #,而井字號(hào)不是使用 encodeURI() 替換的。同樣地,decodeURIComponent() 能夠解碼使用 encodeURIComponent() 編碼的所有字符,即它可以解碼任何特殊字符的編碼。來(lái)看下面的例子:

var uri = "http%3A%2F%2Fshijiajie.com%2Fillegal%20value.htm%23start";

console.log(decodeURI(uri));
// http%3A%2F%2Fshijiajie.com%2Fillegal value.htm%23start

console.log(decodeURIComponent(uri));
// http://shijiajie.com/illegal value.htm#start

這里,變量 uri 包含著一個(gè)由 encodeURIComponent() 編碼的字符串。在第一次調(diào)用 decodeURI() 輸出的結(jié)果中,只有 %20 被替換成了空格。而在第二次調(diào)用 decodeURIComponent() 輸出的結(jié)果中,所有特殊字符的編碼都被替換成了原來(lái)的字符,得到了一個(gè)未經(jīng)轉(zhuǎn)義的字符串(但這個(gè)字符串并不是一個(gè)有效的 URI)。

eval() 方法

eval() 方法就像是一個(gè)完整的 JavaScript 解析器,它只接受一個(gè)參數(shù),即要執(zhí)行的 JavaScript 字符串。看下面的例子:

eval("console.log("hi")");

這行代碼的作用等價(jià)于下面這行代碼:

console.log("hi");

當(dāng)解析器發(fā)現(xiàn)代碼中調(diào)用 eval() 方法時(shí),它會(huì)將傳入的參數(shù)當(dāng)作實(shí)際的 JavaScript 語(yǔ)句來(lái)解析,然后把執(zhí)行結(jié)果插入到原位置。通過(guò) eval() 執(zhí)行的代碼被認(rèn)為是包含該次調(diào)用的執(zhí)行環(huán)境的一部分,因此被執(zhí)行的代碼具有與該執(zhí)行環(huán)境相同的作用域鏈。這意味著通過(guò) eval() 執(zhí)行的代碼可以引用在包含環(huán)境中定義的變量,舉個(gè)例子:

var msg = "hello world";
eval("console.log(msg)");    // "hello world"

可見(jiàn),變量 msg 是在 eval() 調(diào)用的環(huán)境之外定義的,但其中調(diào)用的 console.log() 仍然能夠顯示 "hello world"。這是因?yàn)樯厦娴诙写a最終被替換成了一行真正的代碼。同樣地,我們也可以在 eval() 調(diào)用中定義一個(gè)函數(shù),然后再在該調(diào)用的外部代碼中引用這個(gè)函數(shù):

eval("function sayHi() { console.log("hi"); }");
sayHi();    // "hi"

顯然,函數(shù) sayHi() 是在 eval() 內(nèi)部定義的。但由于對(duì) eval() 的調(diào)用最終會(huì)被替換成定義函數(shù)的實(shí)際代碼,因此可以在下一行調(diào)用 sayHi() 。對(duì)于變量也一樣:

eval("var msg = "hello world";");
console.log(msg);     // "hello world"

eval() 中創(chuàng)建的任何變量或函數(shù)都不會(huì)被提升,因?yàn)樵诮馕龃a的時(shí)候,它們被包含在一個(gè)字符串中;它們只在 eval() 執(zhí)行的時(shí)候創(chuàng)建。

嚴(yán)格模式下,在外部訪(fǎng)問(wèn)不到 eval() 中創(chuàng)建的任何變量或函數(shù),因此前面兩個(gè)例子都會(huì)導(dǎo)致錯(cuò)誤。同樣,在嚴(yán)格模式下,為 eval 賦值也會(huì)導(dǎo)致錯(cuò)誤:

"use strict";
eval = "hi";   // causes error

能夠解釋代碼字符串的能力非常強(qiáng)大,但也非常危險(xiǎn)。因此在使用 eval() 時(shí)必須極為謹(jǐn)慎,特別是在用它執(zhí)行用戶(hù)輸入數(shù)據(jù)的情況下。否則,可能會(huì)有惡意用戶(hù)輸入威脅你的站點(diǎn)或應(yīng)用程序安全的代碼(即所謂的代碼注入)。

Global 對(duì)象的屬性

Global 對(duì)象還包含一些屬性,其中一部分屬性已經(jīng)在本書(shū)前面介紹過(guò)了。例如,特殊的值 undefined、NaN 以及 Infinity 都是 Global 對(duì)象的屬性。此外,所有原生引用類(lèi)型的構(gòu)造函數(shù),像 ObjectFunction,也都是 Global 對(duì)象的屬性。下表列出了 Global 對(duì)象的所有屬性。

屬性 說(shuō)明 屬性 說(shuō)明
undefined 特殊值undefined Date 構(gòu)造函數(shù)Date
NaN 特殊值NaN RegExp 構(gòu)造函數(shù)RegExp
Infinity 特殊值Infinity Error 構(gòu)造函數(shù)Error
Object 構(gòu)造函數(shù)Object EvalError 構(gòu)造函數(shù)EvalError
Array 構(gòu)造函數(shù)Array RangeError 構(gòu)造函數(shù)RangeError
Function 構(gòu)造函數(shù)Function ReferenceError 構(gòu)造函數(shù)ReferenceError
Boolean 構(gòu)造函數(shù)Boolean SyntaxError 構(gòu)造函數(shù)SyntaxError
String 構(gòu)造函數(shù)String TypeError 構(gòu)造函數(shù)TypeError
Number 構(gòu)造函數(shù)Number URIError 構(gòu)造函數(shù)URIError

ECMAScript 5 明確禁止給 undefined、NaNInfinity 賦值,這樣做即使在非嚴(yán)格模式下也會(huì)導(dǎo)致錯(cuò)誤。

window 對(duì)象

JavaScript 雖然沒(méi)有指出如何直接訪(fǎng)問(wèn) Global 對(duì)象,但 Web 瀏覽器都是將這個(gè)全局對(duì)象作為 window 對(duì)象的一部分加以實(shí)現(xiàn)的。因此,在全局作用域中聲明的所有變量和函數(shù),就都成為了 window 對(duì)象的屬性。來(lái)看下面的例子。

var color = "red";

function sayColor(){
    console.log(window.color);
}

window.sayColor();  // "red"

JavaScript 中的 window 對(duì)象除了扮演規(guī)定的 Global 對(duì)象的角色外,還承擔(dān)了很多別的任務(wù)。

 Math 對(duì)象

JavaScript 還為保存數(shù)學(xué)公式和信息提供了一個(gè)公共位置,即 Math 對(duì)象。與我們?cè)?JavaScript 直接編寫(xiě)的計(jì)算功能相比,Math 對(duì)象提供的計(jì)算功能執(zhí)行起來(lái)要快得多。Math 對(duì)象中還提供了輔助完成這些計(jì)算的屬性和方法。

Math 對(duì)象的屬性

Math 對(duì)象包含的屬性大都是數(shù)學(xué)計(jì)算中可能會(huì)用到的一些特殊值。下表列出了這些屬性。

屬性 說(shuō)明
Math.E 自然對(duì)數(shù)的底數(shù),即常量e的值
Math.LN10 10的自然對(duì)數(shù)
Math.LN2 2的自然對(duì)數(shù)
Math.LOG2E 以2為底e的對(duì)數(shù)
Math.LOG10E 以10為底e的對(duì)數(shù)
Math.PI π的值
Math.SQRT1_2 1/2的平方根(即2的平方根的倒數(shù))
Math.SQRT2 2的平方根
min()max() 方法

Math 對(duì)象還包含許多方法,用于輔助完成簡(jiǎn)單和復(fù)雜的數(shù)學(xué)計(jì)算。其中,min()max() 方法用于確定一組數(shù)值中的最小值和最大值。這兩個(gè)方法都可以接收任意多個(gè)數(shù)值參數(shù),如下面的例子所示。

var max = Math.max(3, 54, 32, 16);
console.log(max);    // 54

var min = Math.min(3, 54, 32, 16);
console.log(min);    // 3

要找到數(shù)組中的最大或最小值,可以像下面這樣使用 apply() 方法。

var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);
console.log(max);   // 8

這個(gè)技巧的關(guān)鍵是把 Math 對(duì)象作為 apply() 的第一個(gè)參數(shù),從而正確地設(shè)置 this 值。然后,可以將任何數(shù)組作為第二個(gè)參數(shù)。

舍入方法

下面來(lái)介紹將小數(shù)值舍入為整數(shù)的幾個(gè)方法:Math.ceil()Math.floor()Math.round()。這三個(gè)方法分別遵循下列舍入規(guī)則:

Math.ceil() 執(zhí)行向上舍入,即它總是將數(shù)值向上舍入為最接近的整數(shù);

Math.floor() 執(zhí)行向下舍入,即它總是將數(shù)值向下舍入為最接近的整數(shù);

Math.round() 執(zhí)行標(biāo)準(zhǔn)舍入,即它總是將數(shù)值四舍五入為最接近的整數(shù)。

下面是使用這些方法的示例:

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.floor(25.9));    // 25
console.log(Math.floor(25.5));    // 25
console.log(Math.floor(25.1));    // 25
random() 方法

Math.random() 方法返回介于0和1之間一個(gè)隨機(jī)數(shù),包括0而不包括1。對(duì)于某些站點(diǎn)來(lái)說(shuō),這個(gè)方法非常實(shí)用,因?yàn)榭梢岳盟鼇?lái)隨機(jī)顯示一些名人名言和新聞事件。套用下面的公式,就可以利用 Math.random() 從某個(gè)整數(shù)范圍內(nèi)隨機(jī)選擇一個(gè)值。

值 = Math.floor(Math.random() * 可能值的總數(shù) + 第一個(gè)可能的值)

公式中用到了 Math.floor() 方法,這是因?yàn)?Math.random() 總返回一個(gè)小數(shù)值。而用這個(gè)小數(shù)值乘以一個(gè)整數(shù),然后再加上一個(gè)整數(shù),最終結(jié)果仍然還是一個(gè)小數(shù)。舉例來(lái)說(shuō),如果你想選擇一個(gè)1到10之間的數(shù)值,可以像下面這樣編寫(xiě)代碼:

var num = Math.floor(Math.random() * 10 + 1);

總共有10個(gè)可能的值(1到10),而第一個(gè)可能的值是1。而如果想要選擇一個(gè)介于2到10之間的值,就應(yīng)該將上面的代碼改成這樣:

var num = Math.floor(Math.random() * 9 + 2);

從2數(shù)到10要數(shù)9個(gè)數(shù),因此可能值的總數(shù)就是9,而第一個(gè)可能的值就是2。多數(shù)情況下,其實(shí)都可以通過(guò)一個(gè)函數(shù)來(lái)計(jì)算可能值的總數(shù)和第一個(gè)可能的值,例如:

function selectFrom(lowerValue, upperValue) {
    var choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);
}

var num = selectFrom(2, 10);
console.log(num);   // 介于2和10之間(包括2和10)的一個(gè)數(shù)值

函數(shù) selectFrom() 接受兩個(gè)參數(shù):應(yīng)該返回的最小值和最大值。而用最大值減最小值再加1得到了可能值的總數(shù),然后它又把這些數(shù)值套用到了前面的公式中。這樣,通過(guò)調(diào)用 selectFrom(2,10) 就可以得到一個(gè)介于2和10之間(包括2和10)的數(shù)值了。利用這個(gè)函數(shù),可以方便地從數(shù)組中隨機(jī)取出一項(xiàng),例如:

var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length-1)];
console.log(color);  // 可能是數(shù)組中包含的任何一個(gè)字符串
其他方法

Math 對(duì)象中還包含其他一些與完成各種簡(jiǎn)單或復(fù)雜計(jì)算有關(guān)的方法,但詳細(xì)討論其中每一個(gè)方法的細(xì)節(jié)及適用情形超出了本書(shū)的范圍。下面我們就給出一個(gè)表格,其中列出了這些沒(méi)有介紹到的 Math 對(duì)象的方法。

方法 說(shuō)明
Math.abs(num) 返回num的絕對(duì)值
Math.asin(x) 返回x的反正弦值
Math.exp(num) 返回Math.E的num次冪
Math.atan(x) 返回x的反正切值
Math.log(num) 返回num的自然對(duì)數(shù)
Math.atan2(y,x) 返回y/x的反正切值
Math.pow(num,power) 返回num的power次冪
Math.cos(x) 返回x的余弦值
Math.sqrt(num) 返回num的平方根
Math.sin(x) 返回x的正弦值
Math.acos(x) 返回x的反余弦值
Math.tan(x) 返回x的正切值

雖然 ECMA-262 規(guī)定了這些方法,但不同實(shí)現(xiàn)可能會(huì)對(duì)這些方法采用不同的算法。畢竟,計(jì)算某個(gè)值的正弦、余弦和正切的方式多種多樣。也正因?yàn)槿绱耍@些方法在不同的實(shí)現(xiàn)中可能會(huì)有不同的精度。

關(guān)卡
// 如何高效產(chǎn)生m個(gè)n范圍內(nèi)的不重復(fù)隨機(jī)數(shù)(m<=n)
var getRandomNumber = function(n, m){
    // 待實(shí)現(xiàn)方法體
}
console.log(getRandomNumber(20, 3));  // 8,4,19
更多

關(guān)注微信公眾號(hào)「劼哥舍」回復(fù)「答案」,獲取關(guān)卡詳解。
關(guān)注 https://github.com/stone0090/javascript-lessons,獲取最新動(dòng)態(tài)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80732.html

相關(guān)文章

  • JavaScript 闖關(guān)

    摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語(yǔ)法的語(yǔ)法大量借鑒了及其他類(lèi)語(yǔ)言如和的語(yǔ)法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類(lèi)型 除了 Document 類(lèi)型之外,Element 類(lèi)型就要算是 Web 編程中最常用的類(lèi)型了。Element 類(lèi)型用于表現(xiàn) XML 或 HTML 元素...

    mj 評(píng)論0 收藏0
  • JavaScript 闖關(guān)

    摘要:本課程之所以叫做闖關(guān)記,是因?yàn)椴糠终鹿?jié)精心設(shè)計(jì)了挑戰(zhàn)關(guān)卡,通過(guò)提供更多的實(shí)戰(zhàn)機(jī)會(huì),讓大家可以循序漸進(jìn)地有目的地有挑戰(zhàn)地開(kāi)展學(xué)習(xí)。課程結(jié)構(gòu)及目錄以下目錄只是初步構(gòu)想,課程結(jié)構(gòu)及內(nèi)容會(huì)根據(jù)實(shí)際情況隨時(shí)進(jìn)行調(diào)整。 為何寫(xiě)作此課程 stone 主要負(fù)責(zé)基于 Web 的企業(yè)內(nèi)部管理系統(tǒng)的開(kāi)發(fā),雖然能夠熟練地使用 JavaScript,但隨著對(duì) JavaScript 的理解越來(lái)越深,才發(fā)現(xiàn)自己尚...

    curried 評(píng)論0 收藏0
  • JavaScript 闖關(guān)對(duì)象

    摘要:屬性名可以是包含空字符串在內(nèi)的任意字符串,但對(duì)象中不能存在兩個(gè)同名的屬性??蛻?hù)端中表示網(wǎng)頁(yè)結(jié)構(gòu)的對(duì)象均是宿主對(duì)象。這里的函數(shù)稱(chēng)做構(gòu)造函數(shù),構(gòu)造函數(shù)用以初始化一個(gè)新創(chuàng)建的對(duì)象。通過(guò)關(guān)鍵字和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對(duì)象的原型就是構(gòu)造函數(shù)的屬性的值。 對(duì)象是 JavaScript 的數(shù)據(jù)類(lèi)型。它將很多值(原始值或者其他對(duì)象)聚合在一起,可通過(guò)名字訪(fǎng)問(wèn)這些值,因此我們可以把它看成是從字符串到值的映射...

    rozbo 評(píng)論0 收藏0
  • JavaScript 闖關(guān)函數(shù)

    摘要:把上面的函數(shù)聲明改為等價(jià)的函數(shù)表達(dá)式,就會(huì)在執(zhí)行期間導(dǎo)致錯(cuò)誤。換句話(huà)說(shuō),引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí),對(duì)象引用的就是。這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)對(duì)象的值。 函數(shù)是一段代碼,它只定義一次,但可以被執(zhí)行或調(diào)用任意次。在 JavaScript 里,函數(shù)即對(duì)象,程序可以隨意操控它們。比如,可以把函數(shù)賦值給變量,或者作為...

    alphahans 評(píng)論0 收藏0
  • JavaScript 闖關(guān)簡(jiǎn)介

    摘要:瀏覽器只是實(shí)現(xiàn)的宿主環(huán)境之一,其他宿主環(huán)境包括和。年月,版發(fā)布,成為國(guó)際標(biāo)準(zhǔn)。事件定義了事件和事件處理的接口。對(duì)于已經(jīng)正式納入標(biāo)準(zhǔn)的來(lái)說(shuō),盡管各瀏覽器都實(shí)現(xiàn)了某些眾所周知的共同特性,但其他特性還是會(huì)因?yàn)g覽器而異。 JavaScript 是面向 Web 的編程語(yǔ)言,絕大多數(shù)現(xiàn)代網(wǎng)站都使用了 JavaScript,并且所有的現(xiàn)代 Web 瀏覽器(電腦,手機(jī),平板)均包含了 JavaScri...

    baihe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

antyiwei

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<