一齿风、Object 類型
創(chuàng)建 Object 實(shí)例的方式有兩種。第一種是使用 new 操作符后跟 Object 構(gòu)造函數(shù)先较,如下所示:
另一種是使用對(duì)象字面量表示法洞就。
var person = {};? ?// 與 new Object() 相同
訪問對(duì)象屬性時(shí)有點(diǎn)表示法、方括號(hào)表示法肾胯。通常竖席,除非必須使用變量來(lái)訪問屬性,否則建議使用點(diǎn)表示法敬肚。
二毕荐、Array 類型
ECMAScript 數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。創(chuàng)建數(shù)組的基本方式有兩種艳馒。第一種是使用 Array 構(gòu)造函數(shù)憎亚,如下面代碼所示。
var colors = new Array();
第二種方式是使用數(shù)組字面量表示法弄慰。如下所示:
var colors = ["red", "blue"];
var name = [];
在讀取和設(shè)置數(shù)組的值時(shí)第美,要使用方括號(hào)并提供相應(yīng)值的基于0的數(shù)字索引。
alert(colors[0]);
利用 length 屬性可以方便地在數(shù)組末尾添加新項(xiàng)陆爽。
colors[colors.length] = "black";
1. 檢測(cè)數(shù)組
如果只有一個(gè)全局執(zhí)行環(huán)境可使用 instanceof
ECMAScript5 新增了 Array.isArray() 方法
2. 轉(zhuǎn)換方法
所有對(duì)象都具有 toLocaleString()什往、toString() 和 valueOf() 方法。其中調(diào)用數(shù)組的 toString() 方法會(huì)返回由數(shù)組中的每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串慌闭。而調(diào)用 valueOf() 返回的還是數(shù)組别威。
使用 join() 方法,可以使用不同的分隔符來(lái)構(gòu)建這個(gè)字符串驴剔。
3. 棧方法
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)省古,也就是最新添加的項(xiàng)最早被移除。而棧中項(xiàng)的插入和移除仔拟,只發(fā)生在一個(gè)位置——棧的頂部衫樊。
ECMAScript 為數(shù)組專門提供來(lái) push() 和 pop() 方法,以便實(shí)現(xiàn)類似的棧的行為利花。
push() 方法可以接收任意數(shù)量的參數(shù)科侈,把它們逐個(gè)添加到數(shù)組末尾,并返回修改后的數(shù)組長(zhǎng)度炒事。
pop() 方法則從數(shù)組末尾移除最后一項(xiàng)臀栈,減少數(shù)組的 length 值,然后返回移除的項(xiàng)挠乳。
4. 隊(duì)列方法
隊(duì)列數(shù)據(jù)結(jié)構(gòu)的訪問規(guī)則是先進(jìn)先出权薯。隊(duì)列在列表的末端添加項(xiàng)姑躲,從列表的前端移除項(xiàng)。
數(shù)組方法 shift()盟蚣,它能夠移除數(shù)組中的第一項(xiàng)并返回該項(xiàng)黍析,同時(shí)將數(shù)組的長(zhǎng)度減1.結(jié)合使用 shift() 和 push() 方法,可以像使用隊(duì)列一樣使用數(shù)組屎开。
unshift() 方法與 shift() 用途相反阐枣。它能在數(shù)組的前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度。
5. 重排序方法
reverse() 和 sort()奄抽。reverse() 方法會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序蔼两。
在默認(rèn)情況下,sort() 方法會(huì)按升序排列數(shù)組項(xiàng)逞度。sort() 方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的 toString() 轉(zhuǎn)型方法额划,然后比較得到的字符串,以確定如何排序档泽。
sort() 方法可以接收一個(gè)比較函數(shù)作為參數(shù)俊戳,以便我們指定哪個(gè)值位于哪個(gè)值前面。比較函數(shù)接收兩個(gè)參數(shù)茁瘦,如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前則返回一個(gè)負(fù)數(shù)品抽,如果兩個(gè)參數(shù)相等則返回0,如果第一個(gè)參數(shù)位于第二個(gè)之后則返回一個(gè)正數(shù)甜熔。以下就是一個(gè)簡(jiǎn)單的比較函數(shù):
6. 操作方法
concat() 方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組圆恤。具體來(lái)說,這個(gè)方法會(huì)先創(chuàng)建當(dāng)前數(shù)組一個(gè)副本腔稀,然后將接收到的參數(shù)添加到這個(gè)副本的末尾盆昙,最后返回新構(gòu)建的數(shù)組。
slice() 方法能夠基于當(dāng)前數(shù)組中的一或多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組焊虏。slice() 方法可以接受一或兩個(gè)參數(shù)淡喜,即返回項(xiàng)的起始和結(jié)束位置。slice() 方法不會(huì)影響原始數(shù)組诵闭。
splice() 方法算是最強(qiáng)大的數(shù)組方法炼团,它有很多用法,主要用途是向數(shù)組的中部插入項(xiàng)疏尿。3個(gè)參數(shù):起始位置瘟芝、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。splice() 方法始終都會(huì)返回一個(gè)數(shù)組褥琐,該數(shù)組中包含從原始數(shù)組中刪除的項(xiàng)锌俱。
7. 位置方法
indexOf() 和 lastIndexOf()。兩個(gè)方法都接收兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引敌呈。其中贸宏,indexOf() 方法從數(shù)組的開頭(位置0)開始向后查找造寝,lastIndexOf() 方法則從數(shù)組的末尾開始向前查找。兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組中的位置吭练,或者在沒找到的情況下返回-1诫龙。
在比較第一個(gè)參數(shù)與數(shù)組中的每一項(xiàng)時(shí)扛施,會(huì)使用全等操作符汛聚;也就是說,要求查找的項(xiàng)必須嚴(yán)格相等(就像使用 === 一樣)。
8. 迭代方法
every():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù)浑侥,如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true晰绎。
some():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù)寓落,如果該函數(shù)對(duì)任一項(xiàng)都返回true,則返回true荞下。
filter():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù)伶选,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組。
map():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù)尖昏,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組仰税。
forEach():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù)。這個(gè)方法沒有返回值抽诉。
9. 歸并方法
reduce() 和 reduceRight()陨簇。這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值迹淌。其中河绽,reduce() 方法從數(shù)組的第一項(xiàng)開始,逐個(gè)遍歷到最后唉窃。而 reduceRight() 則從數(shù)組的最后一項(xiàng)開始耙饰,向前遍歷到第一項(xiàng)。
這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值纹份。其函數(shù)接收4個(gè)參數(shù):前一個(gè)值苟跪、當(dāng)前值、項(xiàng)的索引和數(shù)組對(duì)象蔓涧。這個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)件已。
使用 reduce() 方法可以執(zhí)行求數(shù)組中所有值之和的操作,比如:
三蠢笋、Date 類型
創(chuàng)建一個(gè)日期對(duì)象
var now = new Date();
Date.parse() 方法接收一個(gè)表示日期的字符串參數(shù)拨齐,然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)的日期的毫秒數(shù)。
ECMAScript5 添加了 Date.now() 方法昨寞,返回表示調(diào)用這個(gè)方法時(shí)的日期和時(shí)間的毫秒數(shù)瞻惋。在不支持它的瀏覽器中厦滤,使用 + 操作符獲取 Date 對(duì)象的時(shí)間戳,也可以達(dá)到同樣的目的歼狼。
日期/時(shí)間組件方法
getTime()掏导、getFullYear()、getMonth()羽峰、getDate()趟咆、getDay()、getHours梅屉、getMinutes值纱、getSeconds()
四、RegExp 類型
創(chuàng)建一個(gè)正則表達(dá)式:var expression = / pattern / flags;
匹配模式支持3個(gè)標(biāo)志(flags):g(全局模式)坯汤、i(不區(qū)分大小寫模式)虐唠、m(多行模式)。
實(shí)例方法:
exec()惰聂,該方法是專門為捕獲組而設(shè)計(jì)的疆偿。接收一個(gè)參數(shù),即要應(yīng)用模式的字符串搓幌,然后返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組杆故;在數(shù)組中,第一項(xiàng)是與整個(gè)模式匹配的字符串溉愁,其他項(xiàng)是與模式中的捕獲組匹配的字符串处铛。包含兩個(gè)額外的屬性:index 和 input。其中 index 表示匹配項(xiàng)在字符串中的位置叉钥,而 input 表示應(yīng)用正則表達(dá)式的字符串罢缸。
test(),它接收一個(gè)字符串參數(shù)投队。在模式1與該參數(shù)匹配的情況下返回true枫疆;否則,返回false敷鸦。
五息楔、Function 類型
說起來(lái) ECMAScript 中什么最有意思,我想那莫過于函數(shù)了——而有意思的根源扒披,則在于函數(shù)實(shí)際上是對(duì)象值依。每個(gè)函數(shù)都是 Function 類型的實(shí)例,而且都與其他引用類型一樣具有屬性和方法碟案。由于函數(shù)是對(duì)象愿险,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定价说。沒有函數(shù)重載辆亏。
使用不帶圓括號(hào)的函數(shù)名是訪問函數(shù)指針风秤,而非調(diào)用函數(shù)。
1. 函數(shù)聲明與函數(shù)表達(dá)式
解析器會(huì)率先讀取函數(shù)聲明(函數(shù)聲明提升)扮叨,并使其在執(zhí)行任何代碼之前可用(可以訪問)缤弦;至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行彻磁,才會(huì)真正被解析執(zhí)行碍沐。
除了什么時(shí)候可以通過變量訪問函數(shù)這一點(diǎn)區(qū)別之外,函數(shù)聲明與函數(shù)表達(dá)式的語(yǔ)法其實(shí)是等價(jià)的衷蜓。
2. 作為值的函數(shù)
因?yàn)?ECMAScript 中的函數(shù)名本身就是變量累提,所以函數(shù)也可以作為值來(lái)使用。也就是說恍箭,不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù)刻恭,而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。
3. 函數(shù)內(nèi)部屬性
在函數(shù)內(nèi)部扯夭,有兩個(gè)特殊的對(duì)象:arguments 和 this。arguments 是一個(gè)類數(shù)組對(duì)象鞍匾,包含著傳入函數(shù)中的所有參數(shù)交洗。這個(gè)對(duì)象還有一個(gè)名叫 callee 的屬性,該屬性是一個(gè)指針橡淑,指向擁有這個(gè) arguments 對(duì)象的函數(shù)构拳。
this 引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象——或者也可以說是this值(當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí),this 對(duì)象引用的就是 window)梁棠。
4. 屬性和方法
每個(gè)函數(shù)都包含兩個(gè)屬性:length 和 prototype置森。其中,length 屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)符糊;prototype 這里不做詳細(xì)介紹凫海,有專門一篇文章講解。
每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法:apply() 和 call()男娄。這兩個(gè)方法都是在特定的作用域中調(diào)用函數(shù)行贪,實(shí)際上等于設(shè)置函數(shù)體內(nèi) this 對(duì)象的值。首先模闲,apply() 方法接收兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域建瘫,另一個(gè)是參數(shù)數(shù)組。其中尸折,第二個(gè)參數(shù)可以是 Array 的實(shí)例啰脚,也可以是 arguments 對(duì)象。
call() 方法與 apply() 方法的作用相同实夹,它們的區(qū)別僅在于接收參數(shù)的方式不同橄浓。對(duì)于 call() 方法而言粒梦,第一個(gè)參數(shù)是 this 值沒有變化,變化的是其余參數(shù)都直接傳遞給函數(shù)贮配,即必須逐個(gè)列舉出來(lái)谍倦。
事實(shí)上,傳遞參數(shù)并非 apply() 和 call() 真正用武之地泪勒;它們真正強(qiáng)大的地方是能夠擴(kuò)充函數(shù)賴以運(yùn)行的作用域昼蛀。
使用apply() 或 call() 來(lái)擴(kuò)充作用域的最大好處,就是對(duì)象不需要與方法有任何耦合關(guān)系圆存。
ECMAScript5 還定義來(lái)一個(gè)方法:bind()叼旋。這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例,其 this 值會(huì)被綁定到傳給 bind() 函數(shù)的值沦辙。
六夫植、基本包裝類型
為了便于操作基本類型值,ECMAScript 還提供了3個(gè)特殊的引用類型:Boolean油讯、Number 和 String详民。實(shí)際上每當(dāng)讀取一個(gè)基本類型值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象陌兑,從而讓我們能夠調(diào)用一些方法來(lái)操作這些數(shù)據(jù)沈跨。
String類型
字符方法:charAt()、charCodeAt()
字符串操作方法:concat()兔综、slice()饿凛、substr()、substring()
字符串位置方法:indexOf()软驰、lastIndexOf()
trim() 方法
字符串大小寫轉(zhuǎn)換方法:toLowerCase()涧窒、toUpperCase()
字符串的模式匹配方法:match()、search()锭亏、replace()纠吴、split()
七、單體內(nèi)置對(duì)象
ECMAScript-262 對(duì)內(nèi)置對(duì)象的定義是:“由 ECMAScript 實(shí)現(xiàn)提供的贰镣、不依賴與宿主環(huán)境的對(duì)象呜象,這些對(duì)像在 ECMAScript 程序執(zhí)行之前就已經(jīng)存在了”。” 意思就是說恭陡,開發(fā)人員不必顯式地實(shí)例化內(nèi)置對(duì)象,因?yàn)樗鼈円呀?jīng)實(shí)例化了上煤。前面已經(jīng)介紹了大多數(shù)內(nèi)置對(duì)象休玩,例如 Object、Array 和 String。ECMA-262 還定義了兩個(gè)單體內(nèi)置對(duì)象:Global 和 Math拴疤。
1. Global 對(duì)象
不屬于任何其他對(duì)象的屬性和方法永部,最終都是它的屬性和方法。事實(shí)上呐矾,沒有全局變量或全局函數(shù)苔埋;所有在全局作用域中定義的屬性和函數(shù),都是 Global 對(duì)象的屬性蜒犯。
URI 編碼方法
Global 對(duì)象的 encodeURI() 和 encodeURIComponent() 方法可以對(duì) URI(通用資源標(biāo)識(shí)符)進(jìn)行編碼组橄,以便發(fā)送給瀏覽器。有效的 URI 中不能包含某些字符罚随,例如空格玉工。
其中,encodeURI() 主要用于整個(gè)URI(例如淘菩,http://www.wrox.com/illegal value.htm)遵班,而 encodeURIComponent() 主要用于對(duì) URI 中的某一段(例如前面的 URI 中的 illegal value.htm)進(jìn)行編碼。它們的主要區(qū)別在于潮改,encodeURI() 不會(huì)對(duì)本身屬于 URI 的特殊字符進(jìn)行編碼狭郑,例如冒號(hào)、正斜杠汇在、問號(hào)和井字號(hào)愿阐;而?encodeURIComponent() 則會(huì)對(duì)它發(fā)現(xiàn)的任何非標(biāo)準(zhǔn)字符進(jìn)行編碼。
與?encodeURI() 和 encodeURIComponent() 方法對(duì)應(yīng)的兩個(gè)方法分別是 decodeURI() 和 decodeURIComponent()趾疚。
eval() 方法
window 對(duì)象
ECMAScript 雖然沒有指出如何直接訪問 Global 對(duì)象,但 Web 瀏覽器都是將這個(gè)全局對(duì)象作為 window 對(duì)象的一部分加以實(shí)現(xiàn)的以蕴。因此糙麦,在全局作用域中聲明的所有變量和函數(shù),就都成為了 window 對(duì)象的屬性丛肮。
2. Math 對(duì)象
用于輔助完成復(fù)雜的數(shù)學(xué)計(jì)算任務(wù)赡磅。
min() 和 max() 方法,用于確定一組數(shù)值中的最小值和最大值宝与。
舍入方法:Math.ceil()焚廊、Math.floor() 和 Math.round(),分別為向上舍入习劫、向下舍入咆瘟、標(biāo)準(zhǔn)舍入(四舍五入)。
random() 方法诽里,返回大于等于0小于1的一個(gè)隨機(jī)數(shù)袒餐。套用下面的公式,就可以利用 Math.random() 從某個(gè)整數(shù)范圍內(nèi)隨機(jī)選擇一個(gè)值。
值 = Math.floor(Math.random() * 可能值的總數(shù) + 第一個(gè)可能的值)