第1章 掌握J(rèn)avaScript基礎(chǔ)(中)
1.5 基礎(chǔ)考核 葉小凡興奮起來(lái),那種鉆研了很久之后猛地豁然開(kāi)朗的感覺(jué)實(shí)在是 太爽了。趁著心情大好,葉小凡繼續(xù)鉆研《JavaScript基礎(chǔ)修煉要訣》, 一晃半天時(shí)間過(guò)去了。葉小凡性格謹(jǐn)慎,也非??炭?,有很多問(wèn)題即便 弄明白了,也忍不住要舉一反三。 這段時(shí)間,如果肚子餓了,葉小凡就吃身上帶的干糧。這一幕幕, 都被青山院掌尊看在眼里,他心里微微詫異,更多的是欣慰。 “此子修行刻苦,雖然目前只是黃衣弟子,可這種修行的忍耐力和 執(zhí)著,哪怕是宗門(mén)護(hù)法,看到了也要心驚。” 在千鶴派,弟子根據(jù)修為的高低分為黃衣弟子和紅衣弟子。紅衣弟 子之上,便是宗門(mén)護(hù)法,護(hù)法再往上就是掌尊。但凡成為紅衣弟子,便 會(huì)受到宗門(mén)的重視,修行資源和待遇也是水漲船高。如果有幸成為宗門(mén) 護(hù)法,那更是一步登天,在每一個(gè)大院,宗門(mén)護(hù)法的權(quán)力僅次于掌尊! 而此刻的葉小凡,還只是最低一級(jí)的黃衣弟子。 這期間,林元青時(shí)不時(shí)地會(huì)來(lái)到葉小凡的住處為他點(diǎn)撥一二。葉小 凡在林元青的點(diǎn)撥下,很多之前想不通的難題都迎刃而解,他看向林元 青的目光更是多了幾分尊敬。 “葉小凡,下個(gè)月就是我們青山院基礎(chǔ)考核的日子了!”林元青淡淡 說(shuō)道。 “基礎(chǔ)考核?”葉小凡一愣。 “沒(méi)錯(cuò),在千鶴派,每個(gè)月都會(huì)有一次考核,如果考核進(jìn)入前5名, 除了能獲得一筆宗門(mén)的獎(jiǎng)勵(lì),還能收獲不菲的貢獻(xiàn)點(diǎn)。第一名甚至可以 直接進(jìn)階為身份更高的弟子!” 葉小凡自知現(xiàn)在自己是黃衣弟子,一旦晉升成功,就能成為紅衣弟 子。臨走前,林元青看了葉小凡一眼,說(shuō):“希望這次你別讓我失望!” 1.6 葉老 這一日,葉小凡來(lái)到青山院附近的小山上修煉,忽然被一塊石頭絆 了一跤,正在他自認(rèn)倒霉地打算爬起來(lái)的時(shí)候,他在石頭縫里發(fā)現(xiàn)了一 枚古怪的戒指。戒指通體呈現(xiàn)枯黃色,似是年代久遠(yuǎn)。 “摔了一跤,撿到一枚戒指,算是補(bǔ)償吧,雖然這枚戒指應(yīng)該也沒(méi) 什么用。”葉小凡隨手拿起戒指,戴在了手上。就在這時(shí),一股神秘的 力量從葉小凡的丹田之處涌了上來(lái),這股力量將他置身于一個(gè)奇妙的空 間之中。 “哈哈哈,小娃娃,沒(méi)想到我葉老被封印了上千年,今天托你的福 終于重見(jiàn)天日啦!咦,你的修為怎么這么低,竟然連幼兒園的水準(zhǔn)都沒(méi) 有!罷了罷了,從今以后就由我來(lái)教導(dǎo)你,你最好給我盡快達(dá)到大學(xué)的 修為,這樣我就可以真正地自由啦!” 葉小凡被這突如其來(lái)的聲音嚇了一跳,驚慌地喊道:“怎么回事, 你是誰(shuí),你想干什么?” “我是葉老,幾千年前是這片腳本大陸的最強(qiáng)者,只不過(guò)不小心遭 人暗算,才被封印到了這枚戒指中。小娃娃,你現(xiàn)在的修為太低了,等 你到了大學(xué)境界,才能有力量把我放出來(lái),我也就自由了。小娃娃,你 放心,等你把我放出來(lái)后,我絕對(duì)不會(huì)虧待你。跟著我,包你從今往后 吃香的,喝辣的。哎呀,小娃娃,你干什么?快住手,快住手!” 葉小凡雖然謹(jǐn)慎、愿意吃苦,但到底是沒(méi)有遇到過(guò)這么離奇的事 情。戒指里面封印著這片大陸的最強(qiáng)者,這聽(tīng)起來(lái)實(shí)在是有些天方夜譚 了。 葉小凡心想:“莫不是妖怪?嗯,對(duì)了,一定是妖怪!趕緊扔,趕 緊扔!” “這不是真的,我一定是在做夢(mèng),妖怪爺爺,你可別來(lái)找我啦!”說(shuō) 著,葉小凡揚(yáng)起他那只白嫩的小手,手心里攥著那枚剛撿來(lái)的戒指,就 要扔到懸崖下邊。 “小娃娃,你快住手啊,我說(shuō)的是真的,我可不是什么妖怪,我是 葉老啊。哎呀呀,我好不容易等來(lái)一個(gè)人,這么多年都等下來(lái)了,你這 要是一扔,我又要等到猴年馬月才能有希望出來(lái)了!”葉老這下真的急 了,語(yǔ)氣絲毫沒(méi)有了之前的從容和興奮,有的只是驚慌和無(wú)奈。 “哼,你還嘴硬,還說(shuō)你不是妖怪,你當(dāng)我傻啊。大學(xué)境界是傳說(shuō) 中才有的境界,根本沒(méi)有人可以修煉到。我們宗門(mén)的太上大長(zhǎng)老,也不 過(guò)是高中境界,可即便是這樣,他也有只手遮天的能力了,看我不扔了 你?!闭f(shuō)著,葉小凡又要扔。 “哎呀呀,好了好了,我不說(shuō)了好不好?對(duì)了,小娃娃,你來(lái)問(wèn)我 問(wèn)題啊,在這片大陸上,JavaScript的功法和心得還沒(méi)有什么可以問(wèn)倒 我?!比~老都要哭了,真沒(méi)想到自己好不容易有了重獲自由的希望,卻 馬上就要泡湯,能不能不這么刺激呀? 葉小凡聽(tīng)到這話,愣了一下,心想難道這是真的?可轉(zhuǎn)念一想,天 知道這個(gè)老妖怪在打什么主意,還是扔了好,揚(yáng)起手又要扔。 “小娃娃,你可知道對(duì)象數(shù)據(jù)類型?”葉老吼道。 1.7 對(duì)象數(shù)據(jù)類型 聽(tīng)到這句話,葉小凡一頓,動(dòng)作停止了下來(lái)。 對(duì)象數(shù)據(jù)類型在《JavaScript基礎(chǔ)修煉要訣》中只是提了一下,并沒(méi) 有細(xì)講,它深深地勾起了葉小凡的好奇心。 “小娃娃,相見(jiàn)是緣,既然你感興趣,我便教你一教。你且聽(tīng)好, 在JavaScript中,數(shù)據(jù)可分為兩類,分別為原生數(shù)據(jù)類型和對(duì)象數(shù)據(jù)類 型。所謂對(duì)象數(shù)據(jù)類型,是一種復(fù)合型的數(shù)據(jù)類型,它可以把多個(gè)數(shù)據(jù) 放到一起,就好像一個(gè)籃子,這個(gè)籃子里面的每一個(gè)數(shù)據(jù)都可以看作是 一個(gè)單元,它們都有自己的名字和值?!?葉小凡被葉老的話深深地打動(dòng)了,立刻聚精會(huì)神地聽(tīng)起來(lái)。 “現(xiàn)在你相信了,我可還是妖怪?” 葉小凡嘿嘿一笑,重新把戒指戴好。 “小娃娃,你叫什么?” “葉小凡!” “嗯,老夫姓葉,你也姓葉,確實(shí)有緣。小娃娃,我且問(wèn)你,你可 愿意拜我為師?” “弟子愿意!” 說(shuō)完,葉小凡將戒指摘下,放在身前的巖石之上,開(kāi)始行拜師之 禮。葉老雖然沒(méi)有形體,但是卻能看得一清二楚,待所有禮節(jié)完畢,葉 老這才滿意地點(diǎn)了點(diǎn)頭。 “很好,小娃娃,你可聽(tīng)好。對(duì)象數(shù)據(jù)類型比原生數(shù)據(jù)類型強(qiáng)大了 不少,原生數(shù)據(jù)類型,比如數(shù)值型、浮點(diǎn)型、布爾型等都只能存放一些 直接量,也就是說(shuō)單一的數(shù)據(jù)。而對(duì)象數(shù)據(jù)類型卻是可以存放一大堆數(shù) 據(jù)的集合,這些數(shù)據(jù)都有自己的名字,比如……” 忽然,葉小凡心頭一亮,感覺(jué)有清晰的畫(huà)面?zhèn)鱽?lái)。 “我現(xiàn)在沒(méi)有形體,但是我卻可以用意念來(lái)給你做演示,小娃娃, 你且看好?,F(xiàn)在我給你創(chuàng)建一個(gè)對(duì)象。”
“創(chuàng)建對(duì)象就是用一個(gè)大括號(hào)嗎?” “這是創(chuàng)建對(duì)象的一種方式,也是最常用的方式。創(chuàng)建對(duì)象以后, 就相當(dāng)于開(kāi)辟了一塊內(nèi)存,對(duì)象包含若干數(shù)據(jù),每個(gè)數(shù)據(jù)都有自己的名 字和值。對(duì)象好比是一個(gè)容器,現(xiàn)在我要在這個(gè)容器里面放一個(gè)數(shù)據(jù), 你且看好!”
“小娃娃,你可看明白了?” “前輩,您剛才說(shuō)對(duì)象數(shù)據(jù)類型里面可以放若干數(shù)據(jù),那現(xiàn)在它里 面是不是已經(jīng)有了一個(gè)數(shù)據(jù),數(shù)據(jù)的名字叫作caoyao,它的值是字符串 類型的草藥?”葉小凡兩眼放光,回答道。 “嗯,小娃娃,看來(lái)你的悟性還可以。在這個(gè)例子中,caoyao叫作 鍵,草藥叫作值,它是一種鍵值對(duì)的形式?!比~老哈哈大笑。 “鍵值對(duì),鍵值對(duì),一個(gè)鍵對(duì)應(yīng)一個(gè)值,一個(gè)鍵和一個(gè)值就湊成了 一對(duì),鍵和值中間用冒號(hào)。哦,我明白了!”葉小凡恍然大悟,隨即又 問(wèn)道:“那么,前輩老爺爺,您剛才不是說(shuō)對(duì)象數(shù)據(jù)類型里面可以放若 干個(gè)數(shù)據(jù)嗎?現(xiàn)在里面只有一個(gè),怎么添加第二個(gè)呢?” “嗯,小娃娃,這個(gè)問(wèn)題問(wèn)得很好。你且聽(tīng)好,如果你想要在一個(gè) 對(duì)象里面添加新的數(shù)據(jù),則只需要添加一個(gè)逗號(hào),然后寫(xiě)上新的鍵值 對(duì)就行了?!?
“小娃娃,我現(xiàn)在給你演示的方式是在創(chuàng)建對(duì)象的時(shí)候立刻在對(duì)象 里面設(shè)置鍵值對(duì)。其實(shí)還有其他辦法,那就是在對(duì)象創(chuàng)建之后,在外面 對(duì)這個(gè)對(duì)象的變量進(jìn)行操作。你且看好,我現(xiàn)在用新的辦法改寫(xiě)剛才的 例子?!?
“雖然我不太明白這里面的玄妙,但是我大概猜到了caoyao是 container這個(gè)對(duì)象的屬性,似乎就是把剛才寫(xiě)在“{}”里面的東西又在外 面重新寫(xiě)了一次的意思吧。” “嗯,孺子可教,container.caoyao中的點(diǎn)(.)就是對(duì)象訪問(wèn)屬性的 意思,正因?yàn)閏aoyao是container的屬性,所以container才可以用點(diǎn) (.)。對(duì)象包含若干數(shù)據(jù),每個(gè)數(shù)據(jù)都是一個(gè)鍵值對(duì),這些數(shù)據(jù)也叫 作對(duì)象的屬性。那么鍵值對(duì)中的鍵就是屬性名稱,鍵值對(duì)中的值就是屬 性值?!?“我明白了,但是我還有一個(gè)疑問(wèn),如果對(duì)象用點(diǎn)(.)訪問(wèn)一個(gè)根 本不存在的屬性會(huì)怎樣呢?”葉小凡問(wèn)道。 “好問(wèn)題,就比方說(shuō)剛才的例子,如果我直接訪問(wèn)一個(gè)根本不存在 的屬性danyao,那么會(huì)怎樣呢?小娃娃,看好!”
結(jié)果是undefined。 “我明白了,danyao這個(gè)屬性不存在于container對(duì)象中,因此它是 未定義的,得到的結(jié)果就是undefined!”葉小凡驚呼。 1.8 對(duì)象的取值 “小娃娃,我現(xiàn)在問(wèn)你,如果我不知道對(duì)象的某個(gè)屬性叫什么名 字,那么又該怎么訪問(wèn)對(duì)象中對(duì)應(yīng)這個(gè)屬性的值呢?”葉老笑呵呵地問(wèn) 道。 “什么什么,事先都不知道對(duì)象的屬性名稱,怎么可能訪問(wèn)得到 ?。窟@我可不知道,我想這是不可能的?!比~小凡想了想,趕緊搖頭。 “這樣吧,我換一種說(shuō)法。我想你現(xiàn)在已經(jīng)知道對(duì)象可以通過(guò)一個(gè) 點(diǎn)號(hào)(.)訪問(wèn)其中的某一個(gè)數(shù)據(jù)了。”說(shuō)著,葉老隨手一揮,一個(gè)對(duì)象 就生成出來(lái)了。
“我現(xiàn)在想要得到解毒草,就直接用container調(diào)用它的caoyao屬 性?!?
“這樣做的確是可以的,但是如果遇到這種情況,即事先不知道調(diào) 用的屬性叫什么名字,那么該如何用一個(gè)變量定義屬性呢?”說(shuō)著,葉 老又隨手一揮,定義了一個(gè)變量。
“這……”葉小凡也陷入沉思,過(guò)了許久,緩緩說(shuō)道:“直接點(diǎn)prop肯 定不行,那樣的話,container調(diào)用的肯定是一個(gè)叫作prop的屬性。而事 實(shí)上,container對(duì)象里面是沒(méi)有叫作prop的屬性的,得到的結(jié)果肯定是 undefined。” 聽(tīng)到這里,葉老向葉小凡投去了贊賞的目光,繼而說(shuō)道:“你的分 析沒(méi)有錯(cuò),這里不能再用之前的那種方法了。小娃娃,你且看好!”話音剛落,葉老就打出了新的代碼。
“這!”葉小凡驚呼。 看著葉小凡驚訝的樣子,葉老似乎有些得意。 “小娃娃,這就是我教你的新技巧,對(duì)象不僅可以用點(diǎn)號(hào)(.)訪問(wèn) 它的一個(gè)屬性,也可以用中括號(hào)([])。如果用中括號(hào),里面就允許再 寫(xiě)一個(gè)變量。當(dāng)然了,寫(xiě)字符串也是可以的?!?似乎是擔(dān)心葉小凡理解不了,葉老又補(bǔ)充了一行代碼。效果如圖1- 2所示。
過(guò)了好一會(huì)兒,葉小凡才回味過(guò)來(lái),說(shuō)道:“我明白了,如果事先 屬性的名稱未知,或者調(diào)用的屬性是動(dòng)態(tài)變化的,就不能使用點(diǎn)號(hào) 了。使用中括號(hào)可以最大程度地提升對(duì)象調(diào)用屬性的靈活度!” 1.9 循環(huán)遍歷的奧妙 “小娃娃,我且問(wèn)你,可否知道循環(huán)遍歷的法術(shù)?” “循環(huán)遍歷不就是for循環(huán)或者while循環(huán)嗎,這有何難?”說(shuō)著,葉 小凡就隨便打出了一段代碼。
“嗯,你使用的是for循環(huán)。如果你希望一遍又一遍地運(yùn)行相同的代碼,并且每次的值都不同,那么使用循環(huán)是很方便的。就好像你剛才 寫(xiě)的,你想要重復(fù)使用console.log輸出一個(gè)東西,使用for循環(huán)的確可 行。那你可知while循環(huán)?” 葉小凡想了一下,說(shuō)道:“感覺(jué)while循環(huán)和for循環(huán)差不多吧,就是 它們?cè)谡Z(yǔ)法上稍微有點(diǎn)區(qū)別。”說(shuō)著,葉小凡隨手打出一段代碼,將剛 才的for循環(huán)改寫(xiě)成了while循環(huán)。
“i++是自增運(yùn)算符,表示把當(dāng)前的變量自增一個(gè)單位。而++i和 i++是有區(qū)別的,前者代表先自增一個(gè)單位,再運(yùn)算;后者相反,表示 先運(yùn)算,再自增一個(gè)單位。但是由于這段代碼中的i++占單獨(dú)一行,沒(méi) 有對(duì)i進(jìn)行使用,所以不管是++i還是i++,只要這句話執(zhí)行完畢,i的值 都會(huì)自增?!?聽(tīng)到這里,葉老滿意地點(diǎn)了點(diǎn)頭。 “小娃娃,看來(lái)你的基礎(chǔ)不錯(cuò),那你說(shuō)說(shuō)while循環(huán)和for循環(huán)除了語(yǔ) 法還有什么區(qū)別。 “這……”葉小凡一時(shí)語(yǔ)塞。 “小娃娃,你且看好,你方才寫(xiě)的for循環(huán)中有一個(gè)小括號(hào)。小括號(hào) 里面有3個(gè)表達(dá)式,分別為“var i=0”,“i<10”還有“i++”。第1個(gè)語(yǔ)句是在 循環(huán)開(kāi)始之前執(zhí)行的,“var i=0”的意思是定義了一個(gè)變量i,是整數(shù),初 始值為0。第2個(gè)語(yǔ)句是“i<10”,表示進(jìn)入循環(huán)體的條件?!?“循環(huán)體就是那個(gè)用大括號(hào)({})擴(kuò)起來(lái)的部分嗎?”葉小凡問(wèn)道。
“沒(méi)錯(cuò),不論是for循環(huán)還是while循環(huán),循環(huán)體就是這個(gè)部分,這個(gè) 部分里面的代碼是需要被多次執(zhí)行的?,F(xiàn)在我再給你說(shuō)說(shuō)最后一個(gè)語(yǔ) 句“i++”,這個(gè)語(yǔ)句是在剛才我們所說(shuō)的大括號(hào)里面的代碼被全部執(zhí)行 之后才會(huì)被執(zhí)行的。一般來(lái)說(shuō),上面這段語(yǔ)句里面的代碼可以控制循環(huán) 變量i自增一個(gè)單位或者自減一個(gè)單位?!?“自增我知道,無(wú)非就是i++或者++i,為什么要自減呢?” “關(guān)于這個(gè)問(wèn)題,是和第2個(gè)語(yǔ)句相關(guān)聯(lián)的。比如你剛才寫(xiě)的代 碼。”說(shuō)著,葉老指向葉小凡剛才寫(xiě)的代碼。
“你的循環(huán)判斷條件是當(dāng)i<10的時(shí)候才會(huì)進(jìn)入循環(huán)體,也就是后面 用大括號(hào)擴(kuò)起來(lái)的部分,對(duì)吧?”葉老問(wèn)道。 “沒(méi)錯(cuò),最開(kāi)始的時(shí)候i=0,第一次循環(huán)中i自然是小于10的,于是就 進(jìn)入了循環(huán)體,像這樣?!闭f(shuō)著,葉小凡催動(dòng)內(nèi)力,讓這段JavaScript代 碼開(kāi)始執(zhí)行。 當(dāng)執(zhí)行到這一行代碼的時(shí)候,葉小凡特意讓代碼停了下來(lái),調(diào)試代 碼。效果如圖1-3所示。 “嗯,很好,我且問(wèn)你,現(xiàn)在代碼停在了這一行,如果我再往下執(zhí) 行一步,那么會(huì)到第4行還是停留在第3行呢?”葉老問(wèn)道。
“那還用問(wèn),肯定是跳到第4行啦?!比~小凡十分肯定地說(shuō)道。 “先別著急下結(jié)論,走一步試試?!比~老對(duì)葉小凡說(shuō)道。 “試就試?!闭f(shuō)著,葉小凡就用debug走了一步。效果如圖1-4所示。
“這是怎么回事?”葉小凡訝然,同時(shí)皺了皺眉。 “你再走一步試試。”葉老笑呵呵地說(shuō)道。 就這樣,葉小凡又走了一步,這才發(fā)現(xiàn)走到了第4行。經(jīng)過(guò)反復(fù)測(cè) 試,葉小凡緊皺的眉頭終于松開(kāi)了。原來(lái),第一次跳到第3行代碼的時(shí) 候,是在準(zhǔn)備運(yùn)行for循環(huán)的語(yǔ)句1,也就是“var i=0”這句話。因此,剛 才第一次跳到第3行代碼的時(shí)候,i變量的值是undefined(未定義),因 為這個(gè)時(shí)候只聲明了i變量,還沒(méi)有運(yùn)行“i=0”這個(gè)賦值語(yǔ)句,所以是 undefined。而當(dāng)葉小凡往下再走一步的時(shí)候,則是運(yùn)行了“i=0”這個(gè)賦 值語(yǔ)句,這個(gè)時(shí)候,i變量的值才如愿以償?shù)刈兂闪?,整個(gè)語(yǔ)句1才算 是執(zhí)行完畢了。為什么再走一步就能夠跳轉(zhuǎn)到第4行代碼呢?這是因?yàn)?語(yǔ)句1執(zhí)行完畢后就自然會(huì)執(zhí)行語(yǔ)句2了,也就是“i<10”這句話,這就好 比是一個(gè)if判斷。
第一次循環(huán)的時(shí)候,i=0自然是小于10的,因此直接進(jìn)入了循環(huán) 體。循環(huán)體執(zhí)行完畢后,開(kāi)始執(zhí)行語(yǔ)句3——“i++”,i從0變成了1,然后 進(jìn)入第二次循環(huán),再次判斷i是否小于10。 聽(tīng)著葉小凡的論述,葉老微微點(diǎn)了點(diǎn)頭,說(shuō)道:“是這樣的,那么 問(wèn)題來(lái)了,在剛才的例子中,i從0一直自增到10,當(dāng)然,它最后會(huì)變成 10,但是卻無(wú)法再次滿足i<10的判斷條件了。所以,當(dāng)i=10的時(shí)候,就 無(wú)法進(jìn)入循環(huán)體了??墒沁@并沒(méi)有關(guān)系,因?yàn)榈谝淮蝘=0是符合條件 的,最后一次進(jìn)入循環(huán)體是在i=9的時(shí)候,像這樣。”說(shuō)完,葉老隨手一 揮,將這段代碼的運(yùn)行結(jié)果顯示了出來(lái)。效果如圖1-5所示。
“嗯嗯,我明白了,因?yàn)閕變量是從0開(kāi)始的,所以0~9還是循環(huán)了10 次。至于剛才說(shuō)的自減,其實(shí)也是一樣的,只要改變一下循環(huán)條件和初 始化變量i的值就行了?!?說(shuō)完,葉小凡修改了一下代碼。
“同樣是循環(huán)10次,這回就是變量i從10減到0的過(guò)程了?!比~小凡說(shuō) 道。 “沒(méi)錯(cuò),是這樣的。while循環(huán)只是在語(yǔ)法上有所不同,其作用和 for循環(huán)是一樣的。很好,看來(lái)你已經(jīng)掌握了循環(huán)的奧妙?!? 小結(jié) for循環(huán)是你在創(chuàng)建循環(huán)時(shí)常會(huì)用到的工具。也就是說(shuō),如果某一段 代碼需要多次執(zhí)行,若不用循環(huán),則需要將相同的代碼重復(fù)書(shū)寫(xiě)多遍。 下面是for循環(huán)的語(yǔ)法。
while循環(huán)會(huì)在指定條件為真時(shí)循環(huán)執(zhí)行代碼塊。 下面是while循環(huán)的語(yǔ)法。
1.10 對(duì)象內(nèi)容的遍歷 “既然你現(xiàn)在已經(jīng)知道了如何使用for循環(huán),那么現(xiàn)在我就來(lái)教你如 何用這個(gè)技術(shù)遍歷一個(gè)對(duì)象?!比~老說(shuō)道。 “對(duì)象里面無(wú)非就是屬性和函數(shù),你的意思是給我一個(gè)對(duì)象,想辦 法獲取它里面所有的數(shù)據(jù)(鍵值對(duì))嗎?” “沒(méi)錯(cuò),假設(shè)有這樣的一個(gè)場(chǎng)景:我需要判斷一個(gè)對(duì)象中哪些東西 是屬性,哪些東西是函數(shù)。這就需要我依次獲取這個(gè)對(duì)象里面的所有東 西,然后判斷誰(shuí)是屬性、誰(shuí)是函數(shù)。” “等等,就算拿到了這些東西,怎么才能判斷誰(shuí)是屬性、誰(shuí)是函數(shù) ???我好像還沒(méi)有這方面的法術(shù)?!?“不用擔(dān)心,這個(gè)很簡(jiǎn)單,你只需要用一個(gè)typeof關(guān)鍵字就可以了。 比如,我現(xiàn)在有一個(gè)字符串和一個(gè)函數(shù)?!闭f(shuō)著,葉老寫(xiě)出了如下代 碼。
“然后,用typeof關(guān)鍵字包裹一下,再輸出看看?!?
效果如圖1-6所示?!翱吹搅税桑@樣就可以得到變量的類型了。a 是一個(gè)字符串,所以typeof出來(lái)就是string;fun是一個(gè)函數(shù),所以 typeof出來(lái)就是function。接下來(lái),我來(lái)跟你說(shuō)說(shuō)如何遍歷一個(gè)對(duì)象。 首先,新建一個(gè)簡(jiǎn)單的JavaScript對(duì)象。
“然后使用for循環(huán)進(jìn)行遍歷?!?
“效果如圖1-7所示。這個(gè)for循環(huán)和之前的寫(xiě)法是不同的。其中,p 是一個(gè)隨便取的名稱,代表yeXiaoFan對(duì)象中遍歷出來(lái)的屬性名稱。通 過(guò)這種方法,我可以在事先不清楚對(duì)象有哪些屬性的情況下把屬性的名 稱都獲取到?!比~老緩緩地說(shuō)道。
“那么除了屬性名稱,屬性的值也可以得到嗎?”葉小凡眨了兩下眼 睛,好奇地問(wèn)葉老。 “屬性名稱都得到了,你還愁沒(méi)有屬性值嗎?”葉老一吹胡子,笑呵 呵地反問(wèn)。 “啊,我明白了,既然有了屬性名稱,那么對(duì)象可以用點(diǎn)(.)的方 式直接獲取屬性的值。當(dāng)然,用中括號(hào)([])也是可以的?!比~小凡恍 然大悟??吹剿绱吮憩F(xiàn),葉老也不禁點(diǎn)了點(diǎn)頭。 “沒(méi)錯(cuò),是這樣的。我們只需要把剛才的代碼稍做修改就可以 了?!闭f(shuō)著,葉老又打出一段代碼。
“成了,可是你剛才為什么不用點(diǎn)號(hào)?”葉小凡嘀咕道,可是轉(zhuǎn)念一 想就明白了其中的緣由。因?yàn)楸闅v出來(lái)的屬性名稱是不確定的,而是 用一個(gè)p變量指代,既然是變量,自然不可以用點(diǎn)號(hào)。因?yàn)槿绻麑?xiě)成 yeXiaoFan.p,那么就會(huì)被認(rèn)為是尋找一個(gè)名字叫作p的屬性,然而事 實(shí)上,p只不過(guò)是一個(gè)變量的名稱而已。換句話說(shuō),p隨便叫什么都沒(méi) 關(guān)系,反正它只是一個(gè)變量的名稱罷了,真正重要的不是p變量叫什么,而是p變量指代的內(nèi)容是什么。 “我看到你的表情就明白你已經(jīng)懂了,沒(méi)錯(cuò),你的猜想是正確的。 一旦遇到這種屬性名稱不確定的情況,就只能用一個(gè)變量代替,換句 話說(shuō),不能用點(diǎn)號(hào),只能用中括號(hào)。因此,當(dāng)對(duì)象訪問(wèn)屬性的時(shí)候, 用中括號(hào)是更加靈活的?!? “那么,我是不是應(yīng)該時(shí)刻都用中括號(hào),再也不用點(diǎn)號(hào)了?” “那倒不一定,有些情況,或者說(shuō)絕大多數(shù)情況還是用點(diǎn)號(hào)。因?yàn)? 大部分的情況下,你都是已經(jīng)明確知道屬性的名字叫什么了,那么毫無(wú) 疑問(wèn),用點(diǎn)號(hào)是更加方便的,你說(shuō)是吧。” 葉小凡想了一會(huì)兒,然后點(diǎn)了點(diǎn)頭。 1.11 外門(mén)小比 一轉(zhuǎn)眼,大半個(gè)月已經(jīng)過(guò)去了,這段時(shí)間,葉小凡一有時(shí)間就會(huì)向 葉老討教相關(guān)的JavaScript知識(shí)。憑借葉老的廣博見(jiàn)聞和技術(shù)底蘊(yùn),自然 沒(méi)有問(wèn)題。葉小凡也因此受益,這段時(shí)間他的功力突飛猛進(jìn)。 “馬上就要到一年一度的外門(mén)小比了,聽(tīng)說(shuō)這次我們要和紫云派的 弟子進(jìn)行外門(mén)小比。去年我們險(xiǎn)勝了對(duì)方,對(duì)方一直不服氣,據(jù)說(shuō)這次 他們是有備而來(lái)的,而且培養(yǎng)出了一個(gè)天才少年,叫什么簡(jiǎn)南?!? “紫云派超級(jí)新人簡(jiǎn)南,不會(huì)是那個(gè)人吧?他年紀(jì)輕輕就已經(jīng)被內(nèi) 定為下一代掌門(mén)的候選人,據(jù)說(shuō)紫云派這么多年來(lái)就出了這一個(gè)資質(zhì)絕 佳的天才?!? 葉小凡走在路上,時(shí)常聽(tīng)到人們?cè)谧h論這些事情。 “外門(mén)小比似乎有點(diǎn)意思,要是我能夠入選去參加比賽就好了,那 樣也可以給門(mén)派爭(zhēng)光!”葉小凡想。沒(méi)想到,青山院下午就收到了通 知,要求從新入門(mén)的弟子中挑選一位最具天資的人參加即將開(kāi)始的外門(mén) 小比。一石激起千層浪,新入門(mén)的弟子可不止葉小凡一個(gè)人,他們一個(gè) 個(gè)都摩拳擦掌、躍躍欲試。 為了挑選出最為合適的人選,林元青特意在演武場(chǎng)召集了青山院的 所有記名弟子,包括葉小凡在內(nèi),共計(jì)16人。要想獲取參賽的名額,就 必須在這16人中脫穎而出。 演武場(chǎng)占地約2畝,是每個(gè)院定期切磋技藝的地方,16名弟子被安 排在一塊用大理石砌成的場(chǎng)地上兩兩相對(duì),即將進(jìn)行參賽人的角逐。 “我是青山院的林元青,今日,我需要從你們中挑選出一個(gè)人參加 即將到來(lái)的外門(mén)小比。比賽采用兩兩對(duì)決的形式,勝利的一方將進(jìn)入下 一場(chǎng)比賽,失敗者直接退出?!? 這種比賽對(duì)于一些來(lái)看熱鬧的大弟子來(lái)說(shuō)并不陌生,反正每年都是 這樣搞的。前來(lái)觀賽的還有很多其他院的弟子,他們無(wú)非也是想來(lái)看看 這一屆的新人中有沒(méi)有什么特殊的。 “好吧,比賽開(kāi)始,第一場(chǎng)的題目:運(yùn)算符。請(qǐng)每個(gè)弟子根據(jù)自己 的理解詳細(xì)概述運(yùn)算符,然后由我評(píng)判誰(shuí)可以晉級(jí)?!绷衷嗟卣f(shuō) 道,隨后就身形一飄,繼而穩(wěn)穩(wěn)地出現(xiàn)在了裁判席。裁判自然不止林元 青一個(gè)人,其他幾個(gè)院的掌尊今天也一并來(lái)了。 “什么,運(yùn)算符?”有些基礎(chǔ)不好的弟子聽(tīng)到這個(gè)詞當(dāng)即皺起了眉 頭。 1.12 JavaScript運(yùn)算符 題目一出,真是幾家歡喜幾家愁,那些復(fù)習(xí)得好的弟子自然可以侃 侃而談,可是那些基礎(chǔ)薄弱的弟子立刻尷尬得說(shuō)不出話來(lái),甚至有的弟 子已經(jīng)舉起雙手表示要放棄比賽。這些舉動(dòng)立刻引來(lái)了場(chǎng)外那些大弟子 的哄笑。尤其是其他院的弟子,更是投來(lái)睥睨的目光。 林元青見(jiàn)此暗嘆一聲,卻沒(méi)有特別失落。根據(jù)往年的經(jīng)驗(yàn),青山院 的生源都是最差的,學(xué)得好的人更是鳳毛麟角。因此,青山院的弟子行 走在宗門(mén),也總是要比別人低上一等。 “哈哈,不愧是吊車尾的青山院,今年果然還是老樣子,運(yùn)算符這 么簡(jiǎn)單的東西都能難住這么多人?!? “就是啊,不過(guò)是運(yùn)算符罷了,我看啊,青山院遲早退出內(nèi)門(mén),成 為外門(mén)院系吧?!? 第一場(chǎng),是葉小凡和一個(gè)同門(mén)弟子之間的對(duì)決。 “快看,那個(gè)叫作葉小凡的據(jù)說(shuō)才入門(mén)不久,依我看,運(yùn)算符雖然 簡(jiǎn)單,可也不是這樣一個(gè)剛?cè)腴T(mén)的愣頭青能夠理解的。” “就是啊,這不,他現(xiàn)在的臉色可真是要多難看有多難看啊,哈 哈?!? 葉小凡沒(méi)有理會(huì)這些流言蜚語(yǔ),而是眉頭緊鎖。倒不是說(shuō)運(yùn)算符這 么簡(jiǎn)單的知識(shí)他不會(huì),而是因?yàn)槿~老這個(gè)BUG級(jí)的老家伙存在,他平時(shí) 沒(méi)少給葉小凡灌輸一些比較深?yuàn)W的功法和概念。因此,哪怕只是簡(jiǎn)簡(jiǎn)單 單的運(yùn)算符,葉小凡也需要好好思考該如何概述。就在這時(shí),對(duì)面?zhèn)鱽?lái) 了一陣傲慢的聲音。 “嗨,你就是那個(gè)什么葉小凡吧?算你運(yùn)氣不好,碰上了我。我可 告訴你,在JavaScript基礎(chǔ)功法中,可沒(méi)有什么功法可以難得住我。所以 我勸你早點(diǎn)認(rèn)輸投降吧。我看你對(duì)運(yùn)算符也不是特別熟悉,何必在這丟 人現(xiàn)眼呢,哈哈哈!” 葉小凡抬頭一看,只見(jiàn)一個(gè)和自己年齡相仿的少年已經(jīng)開(kāi)始自信地 解釋起來(lái)。 “JavaScript運(yùn)算符,無(wú)非加、減、乘、除和賦值運(yùn)算,何難之有? 賦值運(yùn)算符用于給JavaScript變量賦值。比如我現(xiàn)在有一個(gè)變量“vara;”,那么這個(gè)變量的值就是undefined,因?yàn)闆](méi)有定義嘛。然后,我當(dāng) 然需要給它賦值咯。賦值的方法就是用“=”,把真正的值用“=”賦給它, 這個(gè)就叫作賦值。加、減、乘、除自然不用多說(shuō),不就是最簡(jiǎn)單的算術(shù) 運(yùn)算嘛。比如我有兩個(gè)變量,先用賦值運(yùn)算符給它們賦值,然后計(jì)算 加、減、乘、除。這樣吧,我寫(xiě)一段代碼就全清楚了?!?
“葉小凡,這段代碼你能看得懂嗎?我想你也是看不懂的吧。好 了,本人就大發(fā)慈悲地跟你解釋一下?!? 林元青注視著這一切,沒(méi)有多說(shuō)話,根據(jù)演武場(chǎng)的規(guī)則,比賽雙方 切磋技藝時(shí)可以互相給對(duì)方提問(wèn)題,然后根據(jù)雙方的作答情況和問(wèn)題的 質(zhì)量由評(píng)審團(tuán)打出一定的分?jǐn)?shù)。 “老林啊,看來(lái)這個(gè)弟子基礎(chǔ)還可以啊,而且還很自信啊。想必這 應(yīng)該就是你們?cè)旱淖罡咚疁?zhǔn)了吧?!闭f(shuō)話的是綠水院的掌尊尹曾琪,他 平時(shí)和林元青的關(guān)系不太好,常常喜歡冷嘲熱諷。林元青笑了笑,并未 答話。 “葉小凡,你可聽(tīng)好了,我就說(shuō)一遍。因?yàn)閍=10,b=2,所以兩者加 起來(lái)就是12。所以,s1=12錯(cuò)不了。a-b=8,a*b=20,最后是除法,10除 以2自然是等于5啦。” “好,現(xiàn)在輪到我說(shuō)了。你方才講得自然不錯(cuò),但是除了加、減、 乘、除,還有3個(gè)運(yùn)算符沒(méi)有說(shuō)到。”葉小凡淡淡地說(shuō)道。 “什么?那你說(shuō)說(shuō)還有什么運(yùn)算符?!睂?duì)面的弟子急切地說(shuō)道。 “首先是取余數(shù)的運(yùn)算符‘%’,取余數(shù)的意思是一個(gè)數(shù)字除以另一個(gè) 數(shù)字,除不盡的部分就是余數(shù)。比如5除以2,得到的結(jié)果就是2.5。當(dāng) 然,0.5是小數(shù),既然要取余數(shù),自然就不能寫(xiě)成小數(shù)形式。5除以2, 能夠被整除的就是2(5=2×2+1),余下來(lái)1,因此余數(shù)就是1。還有一種 情況是小的數(shù)字除以大的數(shù)字,一個(gè)都不能被整除,比如2除以5,那么 余數(shù)就是2本身?!? “啊,啊,是的,我正想要說(shuō)呢,還有取余運(yùn)算符?!? “除了取余運(yùn)算符,還有自增運(yùn)算符和自減運(yùn)算符。自增運(yùn)算符是 ++,自減運(yùn)算符是--。顧名思義,自增和自減運(yùn)算符可以使得當(dāng)前的變 量自增一個(gè)單位或者自減一個(gè)單位。這里有一個(gè)需要注意的地方:不管 是自增運(yùn)算符還是自減運(yùn)算符,它們都分為兩種,比如下面這個(gè)例 子?!?
“如果這樣寫(xiě),得到的結(jié)果你猜等于幾?” “哼,這有何難,自增代表自增一個(gè)單位。既然寫(xiě)了a++,那么b自 然就是11了,你當(dāng)我傻啊,問(wèn)我這么簡(jiǎn)單的問(wèn)題?!睂?duì)面的弟子氣呼呼 地說(shuō)道。 “錯(cuò)了,答案是10?!比~小凡淡淡地說(shuō)道,并且運(yùn)功執(zhí)行了這一段代 碼,只見(jiàn)得到的結(jié)果為10。 “這,這,怎么可能?”對(duì)面的弟子頓時(shí)驚呼道。 “對(duì)于自增運(yùn)算符,它分為前置++和后置++。前置++就是在變量的 前面寫(xiě)一個(gè)“++”,后置++就是在變量的后面寫(xiě)一個(gè)“++”,在剛才的例子 中,就是后置++。后置++的特點(diǎn)是先讓變量參與運(yùn)算,運(yùn)算結(jié)束以后再進(jìn)行自增。好,再看一下我剛才舉的例子?!?
“尤其注意第2句?!比~小凡用手指著第2句“var b = a++”說(shuō)道,“因 為“a++”里面的“++”是放在后面的,那么這個(gè)是后置++。后置++的意思 就是先把a(bǔ)原來(lái)的值放進(jìn)式子里面運(yùn)算,然后自增。也就是說(shuō),在這個(gè) 賦值語(yǔ)句中,賦給變量b的值依然是10,而不是++后的11。” “切,這有什么難的,我剛才不過(guò)就是一時(shí)疏忽罷了。如果我現(xiàn)在 把題目改一改,就是11了吧。”對(duì)面的弟子在聽(tīng)完后感到很不服氣,于 是大手一揮,把代碼改了改。
寫(xiě)完后,只見(jiàn)他想了想,終于鼓足勇氣說(shuō)道:“這個(gè)就是前置 ++了,++a的意思是先讓a的值自增一次,a本來(lái)是10,經(jīng)過(guò)自增就變成 了11。因?yàn)榍爸?+的含義是先讓變量自增,再放進(jìn)式子里面運(yùn)算,所以 這個(gè)代碼的結(jié)果就是11?!? 說(shuō)完,對(duì)面的弟子開(kāi)始運(yùn)功,將代碼執(zhí)行了一遍。果不其然,得到 的結(jié)果是11。 “自然是這樣的,但是我現(xiàn)在這樣改一下,你說(shuō)結(jié)果是多少呢?”葉 小凡詭異地笑了笑,然后打出一段比較奇特的代碼。
“噗!”看到這段代碼,對(duì)面弟子差點(diǎn)一口老血噴出來(lái),破口大 罵:“葉小凡,你……你……你欺人太甚!” “呵呵,這位師兄,這可怨不了我,再說(shuō)了,互相切磋技藝也是演 武場(chǎng)的規(guī)矩啊。”葉小凡回想起這段被葉老折磨的日子,再看到面前這 位弟子的表情,頓時(shí)開(kāi)心了不少。其實(shí)這道題目就是平時(shí)葉老給葉小凡 做練習(xí)的時(shí)候出的。 “這個(gè)小娃娃倒是有趣?!本G水院掌尊尹曾琪看到葉小凡竟然能出這 樣的題,縱然是他也眼前一亮,不由稱贊道。當(dāng)然,以他目前的修為, 這種題目自然是難不住他的。但是很難想象,一個(gè)剛剛進(jìn)入山門(mén)的小娃 娃竟然有如此造詣,實(shí)在是讓人驚訝。 “這道題看似復(fù)雜,其實(shí)只要一步一步拆分,也是可以分析和理解 得很透徹的?!绷衷辔⑽⒁恍?,看著葉小凡的目光中多了幾分期待。 畢竟,葉小凡是他親自帶上山來(lái)的,他多少有一點(diǎn)印象,而且他也很想 看看,葉小凡如何解答這道題。 “天哪,這種題目也太匪夷所思了吧。這個(gè)葉小凡真是不知道天有 多高,地有多厚?!? “就是,就是,依我看吶,這根本就是那個(gè)葉小凡隨便瞎掰的一道 題,我看他自己多半也做不出來(lái)?!? “哈哈,師兄說(shuō)的是啊,就讓我們一起看看他如何出糗吧?!? 場(chǎng)外有很多資歷比葉小凡高出不少的大弟子,他們剛才試著算了一 下,但是馬上就自行放棄了,紛紛向葉小凡投來(lái)鄙夷的目光。但是,其 中有一道目光卻充滿了嚴(yán)肅,這個(gè)人是一個(gè)和葉小凡年齡相仿的少年, 旁邊有幾個(gè)功力深厚的年輕人跟隨著他。這時(shí)候,一個(gè)長(zhǎng)相略顯老氣的 人對(duì)該少年說(shuō)道:“少爺,您是當(dāng)今太上大長(zhǎng)老最喜愛(ài)的長(zhǎng)孫,資質(zhì)和 天賦也是我派數(shù)百年來(lái)的翹楚。依屬下看,這個(gè)葉小凡真是不知天高地 厚,多半是隨便糊弄了一下,自己都不知道這道題怎么解?!?只見(jiàn)少年把手一揚(yáng),那名男子立刻不說(shuō)話了。接著,他饒有興趣地 看著葉小凡,這人便是門(mén)派內(nèi)定的繼承人,門(mén)派中太上大長(zhǎng)老最喜歡的 長(zhǎng)孫——羅丹。 1.13 語(yǔ)驚四座