——直接量。
編程世界中的直接量,就是表麵上可以見到的數據值。常見的直接量有數字、小數、字符串。修行者利用自身體內的能量,凝結出一個個簡單的直接量。葉小凡目前的修為較低,連最基本的學徒境界都沒到,體內能量薄弱,經過多次嘗試,隻能凝練出一些簡單的數字,比如10、20。忽然,葉小凡目光一閃,一個字符串在體內形成!葉小凡細細感悟,原來是一個“Hello World”字符串,葉小凡善於觀察,立刻發現了字符串和數字的不同。字符串的出現必然帶著雙引號,被很好地包裹住,而數字則是光禿禿的,如10或者20,沒有雙引號。
“原來,字符串一定需要用雙引號包裹,那麼單引號是否可行呢?”葉小凡重新運氣,轉眼間,一個用單引號包裹的‘Hello World’就出現了。見此,葉小凡大喜,哈哈,原來單引號也可以。
1 "Hello World"
2 'Hello World'
突然,這兩個字符串和數字像是失去了依托,瞬間化為虛無。葉小凡一驚,心道:看來直接創造出來的直接量隻是曇花一現,無法持久存在,要是有一個什麼東西能把直接量裝起來就好了。
1.3 變量的聲明
葉小凡收起心神,繼續閱讀《JavaScript基礎修煉要訣》,忽然間,他眼前一亮。
“原來如此,直接量雖然隻是曇花一現,但是如果能用var定義一個變量,再將它指向那個直接量,就能有保存數據的妙用了!”
想到這裡,葉小凡立即催動功法,定義了一個變量。
var a;
“成了!”,葉小凡開心地一拍手,心念一動,一個用雙引號包裹的“Hello World”字符串憑空出現。這一次,沒等字符串遁入虛無,葉小凡就立刻讓變量a指向了這個字符串。
var a;
a = "Hello World";
“嗯,有點麻煩,還不如直接合並為一句,先定義變量,然後指向一個字符串,這種操作分成了兩步,還是一步到位更好。”就在葉小凡這麼想的時候,代碼立刻發生了變化。
var a = "Hello World";
原來這樣也可以!
1.4 數據類型
修行還在繼續,隨著對要訣理解的深入,葉小凡明白,在編程世界中,剛才的直接量都屬於一種數據,如同人有男女之分一樣,數據也是有類型的。在JavaScript中,數據可分為兩類,分別為原生數據類型(primitive type)和對象數據類型(object type)。
葉小凡心念一動,數字“6”立刻浮現在他體內的內存元海中,同時,為了不讓數字消失,他還專門定義了一個變量指向這個數字。
var num = 6;
葉小凡心中已有明悟,這個數字和字符串都屬於原生數據類型。那麼,還有其他原生數據類型嗎?隨著心念掃過要訣,一炷香的時間後,葉小凡已經若有所悟。原來,原生數據類型包括數字、字符串、布爾值,還有兩個特殊的類型:null和undefined。
“布爾值,”葉小凡口中喃喃,“它是一種隻有true和false兩種狀態的類型。”嗯,就好像以前自己在村子裡點蠟燭,要麼蠟燭亮起來,要麼蠟燭熄滅,隻有這兩種狀態。至於null和undefined,葉小凡略一皺眉,結合秘籍,開始了感悟。
一炷香的時間過去了,葉小凡猛地睜眼,呼吸都有點急促。
“我明白了!從用法上來看,null和undefined都代表了直接量的空缺,如果一個變量指向了其中任何一個,都代表false的含義,也表示沒有或空的概念。而從根本意義上講,undefined要比null更加嚴重一點,代表本不應該出現的錯誤,比如我剛才定義了一個變量a,但是我沒有把任何直接量賦給它,那麼a就默認指向了undefined;而null不同,有的時候,我需要給某些變量賦值null,以達到清空的目的。”
拓展閱讀
JavaScript包括直接量和變量。首先說直接量,什麼是直接量呢?在JavaScript的世界裡,直接量包含數值(如10/20)、邏輯值(true/false)、字符串(如“nihao”)、null、undefined、對象和函數。其中,函數也稱方法,對象和函數會在之後的章節中慢慢介紹。你暫時可以認為對象是存放數據的一個容器,而函數是應用程序處理某一係列邏輯的一個過程設計。
null是一個特殊的關鍵字,表示沒有值;null也是一個原始值,因為JavaScript是大小寫敏感的,所以null和Null、NULL或者其他變量是有區別的。
undefined是一個頂級屬性,它代表某一個變量未定義。同樣,undefined也是一個原始值。
說完直接量,再來說變量。所謂變量,就是指向了某個直接量或者其他變量的“鑰匙”。比方說,把一個直接量true比作一扇門,然後定義一個變量flag,最後通過賦值運算符“=”將這個true賦值給flag,這樣就完成了一個變量的綁定。
從此以後,你在別處使用變量flag,也就相當於使用了直接量true。簡單來說,就是這麼回事。
1.5 基礎考核
葉小凡興奮起來,那種鑽研了很久之後猛地豁然開朗的感覺實在是太爽了。趁著心情大好,葉小凡繼續鑽研《JavaScript基礎修煉要訣》,一晃半天時間過去了。葉小凡性格謹慎,也非常刻苦,有很多問題即便弄明白了,也忍不住要舉一反三。
這段時間,如果肚子餓了,葉小凡就吃身上帶的乾糧。這一幕幕,都被青山院掌尊看在眼裡,他心裡微微詫異,更多的是欣慰。
“此子修行刻苦,雖然目前隻是黃衣弟子,可這種修行的忍耐力和執著,哪怕是宗門護法,看到了也要心驚。”
在千鶴派,弟子根據修為的高低分為黃衣弟子和紅衣弟子。紅衣弟子之上,便是宗門護法,護法再往上就是掌尊。但凡成為紅衣弟子,便會受到宗門的重視,修行資源和待遇也是水漲船高。如果有幸成為宗門護法,那更是一步登天,在每一個大院,宗門護法的權力僅次於掌尊!而此刻的葉小凡,還隻是最低一級的黃衣弟子。
這期間,林元青時不時地會來到葉小凡的住處為他點撥一二。葉小凡在林元青的點撥下,很多之前想不通的難題都迎刃而解,他看向林元青的目光更是多了幾分尊敬。
“葉小凡,下個月就是我們青山院基礎考核的日子了!”林元青淡淡說道。
“基礎考核?”葉小凡一愣。
“沒錯,在千鶴派,每個月都會有一次考核,如果考核進入前5名,除了能獲得一筆宗門的獎勵,還能收獲不菲的貢獻點。第一名甚至可以直接進階為身份更高的弟子!”
葉小凡自知現在自己是黃衣弟子,一旦晉升成功,就能成為紅衣弟子。臨走前,林元青看了葉小凡一眼,說:“希望這次你別讓我失望!”
1.6 葉老
這一日,葉小凡來到青山院附近的小山上修煉,忽然被一塊石頭絆了一跤,正在他自認倒黴地打算爬起來的時候,他在石頭縫裡發現了一枚古怪的戒指。戒指通體呈現枯黃色,似是年代久遠。
“摔了一跤,撿到一枚戒指,算是補償吧,雖然這枚戒指應該也沒什麼用。”葉小凡隨手拿起戒指,戴在了手上。就在這時,一股神秘的力量從葉小凡的丹田之處湧了上來,這股力量將他置身於一個奇妙的空間之中。
“哈哈哈,小娃娃,沒想到我葉老被封印了上千年,今天托你的福終於重見天日啦!咦,你的修為怎麼這麼低,竟然連幼兒園的水準都沒有!罷了罷了,從今以後就由我來教導你,你最好給我儘快達到大學的修為,這樣我就可以真正地自由啦!”
葉小凡被這突如其來的聲音嚇了一跳,驚慌地喊道:“怎麼回事,你是誰,你想乾什麼?”
“我是葉老,幾千年前是這片腳本大陸的最強者,隻不過不小心遭人暗算,才被封印到了這枚戒指中。小娃娃,你現在的修為太低了,等你到了大學境界,才能有力量把我放出來,我也就自由了。小娃娃,你放心,等你把我放出來後,我絕對不會虧待你。跟著我,包你從今往後吃香的,喝辣的。哎呀,小娃娃,你乾什麼?快住手,快住手!”
葉小凡雖然謹慎、願意吃苦,但到底是沒有遇到過這麼離奇的事情。戒指裡麵封印著這片大陸的最強者,這聽起來實在是有些天方夜譚了。
葉小凡心想:“莫不是妖怪?嗯,對了,一定是妖怪!趕緊扔,趕緊扔!”
“這不是真的,我一定是在做夢,妖怪爺爺,你可別來找我啦!”說著,葉小凡揚起他那隻白嫩的小手,手心裡攥著那枚剛撿來的戒指,就要扔到懸崖下邊。
“小娃娃,你快住手啊,我說的是真的,我可不是什麼妖怪,我是葉老啊。哎呀呀,我好不容易等來一個人,這麼多年都等下來了,你這要是一扔,我又要等到猴年馬月才能有希望出來了!”葉老這下真的急了,語氣絲毫沒有了之前的從容和興奮,有的隻是驚慌和無奈。
“哼,你還嘴硬,還說你不是妖怪,你當我傻啊。大學境界是傳說中才有的境界,根本沒有人可以修煉到。我們宗門的太上大長老,也不過是高中境界,可即便是這樣,他也有隻手遮天的能力了,看我不扔了你。”說著,葉小凡又要扔。
“哎呀呀,好了好了,我不說了好不好?對了,小娃娃,你來問我問題啊,在這片大陸上,JavaScript的功法和心得還沒有什麼可以問倒我。”葉老都要哭了,真沒想到自己好不容易有了重獲自由的希望,卻馬上就要泡湯,能不能不這麼刺激呀?
葉小凡聽到這話,愣了一下,心想難道這是真的?可轉念一想,天知道這個老妖怪在打什麼主意,還是扔了好,揚起手又要扔。
“小娃娃,你可知道對象數據類型?”葉老吼道。
1.7 對象數據類型
聽到這句話,葉小凡一頓,動作停止了下來。
對象數據類型在《JavaScript基礎修煉要訣》中隻是提了一下,並沒有細講,它深深地勾起了葉小凡的好奇心。
“小娃娃,相見是緣,既然你感興趣,我便教你一教。你且聽好,在JavaScript中,數據可分為兩類,分別為原生數據類型和對象數據類型。所謂對象數據類型,是一種複合型的數據類型,它可以把多個數據放到一起,就好像一個籃子,這個籃子裡麵的每一個數據都可以看作是一個單元,它們都有自己的名字和值。”
葉小凡被葉老的話深深地打動了,立刻聚精會神地聽起來。
“現在你相信了,我可還是妖怪?”
葉小凡嘿嘿一笑,重新把戒指戴好。
“小娃娃,你叫什麼?”
“葉小凡!”
“嗯,老夫姓葉,你也姓葉,確實有緣。小娃娃,我且問你,你可願意拜我為師?”
“弟子願意!”
說完,葉小凡將戒指摘下,放在身前的岩石之上,開始行拜師之禮。葉老雖然沒有形體,但是卻能看得一清二楚,待所有禮節完畢,葉老這才滿意地點了點頭。
“很好,小娃娃,你可聽好。對象數據類型比原生數據類型強大了不少,原生數據類型,比如數值型、浮點型、布爾型等都隻能存放一些直接量,也就是說單一的數據。而對象數據類型卻是可以存放一大堆數據的集合,這些數據都有自己的名字,比如……”
忽然,葉小凡心頭一亮,感覺有清晰的畫麵傳來。
“我現在沒有形體,但是我卻可以用意念來給你做演示,小娃娃,你且看好。現在我給你創建一個對象。”
var container = {};
“創建對象就是用一個大括號嗎?”
“這是創建對象的一種方式,也是最常用的方式。創建對象以後,就相當於開辟了一塊內存,對象包含若乾數據,每個數據都有自己的名字和值。對象好比是一個容器,現在我要在這個容器裡麵放一個數據,你且看好!”
“小娃娃,你可看明白了?”
“前輩,您剛才說對象數據類型裡麵可以放若乾數據,那現在它裡麵是不是已經有了一個數據,數據的名字叫作caoyao,它的值是字符串類型的草藥?”葉小凡兩眼放光,回答道。
“嗯,小娃娃,看來你的悟性還可以。在這個例子中,caoyao叫作鍵,草藥叫作值,它是一種鍵值對的形式。”葉老哈哈大笑。
“鍵值對,鍵值對,一個鍵對應一個值,一個鍵和一個值就湊成了一對,鍵和值中間用冒號。哦,我明白了!”葉小凡恍然大悟,隨即又問道:“那麼,前輩老爺爺,您剛才不是說對象數據類型裡麵可以放若乾個數據嗎?現在裡麵隻有一個,怎麼添加第二個呢?”
“嗯,小娃娃,這個問題問得很好。你且聽好,如果你想要在一個對象裡麵添加新的數據,則隻需要添加一個逗號,然後寫上新的鍵值對就行了。”
“小娃娃,我現在給你演示的方式是在創建對象的時候立刻在對象裡麵設置鍵值對。其實還有其他辦法,那就是在對象創建之後,在外麵對這個對象的變量進行操作。你且看好,我現在用新的辦法改寫剛才的例子。”
“雖然我不太明白這裡麵的玄妙,但是我大概猜到了caoyao是container這個對象的屬性,似乎就是把剛才寫在“{}”裡麵的東西又在外麵重新寫了一次的意思吧。”
“嗯,孺子可教,container.caoyao中的點(.)就是對象訪問屬性的意思,正因為caoyao是container的屬性,所以container才可以用點(.)。對象包含若乾數據,每個數據都是一個鍵值對,這些數據也叫作對象的屬性。那麼鍵值對中的鍵就是屬性名稱,鍵值對中的值就是屬性值。”
“我明白了,但是我還有一個疑問,如果對象用點(.)訪問一個根本不存在的屬性會怎樣呢?”葉小凡問道。
“好問題,就比方說剛才的例子,如果我直接訪問一個根本不存在的屬性danyao,那麼會怎樣呢?小娃娃,看好!”
結果是undefined。
“我明白了,danyao這個屬性不存在於container對象中,因此它是未定義的,得到的結果就是undefined!”葉小凡驚呼。
1.8 對象的取值
“小娃娃,我現在問你,如果我不知道對象的某個屬性叫什麼名字,那麼又該怎麼訪問對象中對應這個屬性的值呢?”葉老笑嗬嗬地問道。
“什麼什麼,事先都不知道對象的屬性名稱,怎麼可能訪問得到啊?這我可不知道,我想這是不可能的。”葉小凡想了想,趕緊搖頭。
“這樣吧,我換一種說法。我想你現在已經知道對象可以通過一個點號(.)訪問其中的某一個數據了。”說著,葉老隨手一揮,一個對象就生成出來了。
“我現在想要得到解毒草,就直接用container調用它的caoyao屬性。”
container.caoyao
“這樣做的確是可以的,但是如果遇到這種情況,即事先不知道調用的屬性叫什麼名字,那麼該如何用一個變量定義屬性呢?”說著,葉老又隨手一揮,定義了一個變量。
“這……”葉小凡也陷入沉思,過了許久,緩緩說道:“直接點prop肯定不行,那樣的話,container調用的肯定是一個叫作prop的屬性。而事實上,container對象裡麵是沒有叫作prop的屬性的,得到的結果肯定是undefined。”
聽到這裡,葉老向葉小凡投去了讚賞的目光,繼而說道:“你的分析沒有錯,這裡不能再用之前的那種方法了。小娃娃,你且看好!”話音剛落,葉老就打出了新的代碼。
效果如圖1-1所示。
圖1-1 打印結果
“這!”葉小凡驚呼。
看著葉小凡驚訝的樣子,葉老似乎有些得意。
“小娃娃,這就是我教你的新技巧,對象不僅可以用點號(.)訪問它的一個屬性,也可以用中括號([])。如果用中括號,裡麵就允許再寫一個變量。當然了,寫字符串也是可以的。”
似乎是擔心葉小凡理解不了,葉老又補充了一行代碼。效果如圖1-2所示。
圖1-2 打印結果
過了好一會兒,葉小凡才回味過來,說道:“我明白了,如果事先屬性的名稱未知,或者調用的屬性是動態變化的,就不能使用點號了。使用中括號可以最大程度地提升對象調用屬性的靈活度!”
1.9 循環遍曆的奧妙
“小娃娃,我且問你,可否知道循環遍曆的法術?”
“循環遍曆不就是for循環或者while循環嗎,這有何難?”說著,葉小凡就隨便打出了一段代碼。
“嗯,你使用的是for循環。如果你希望一遍又一遍地運行相同的代碼,並且每次的值都不同,那麼使用循環是很方便的。就好像你剛才寫的,你想要重複使用console.log輸出一個東西,使用for循環的確可行。那你可知while循環?”
葉小凡想了一下,說道:“感覺while循環和for循環差不多吧,就是它們在語法上稍微有點區別。”說著,葉小凡隨手打出一段代碼,將剛才的for循環改寫成了while循環。
“i++是自增運算符,表示把當前的變量自增一個單位。而++i和i++是有區別的,前者代表先自增一個單位,再運算;後者相反,表示先運算,再自增一個單位。但是由於這段代碼中的i++占單獨一行,沒有對i進行使用,所以不管是++i還是i++,隻要這句話執行完畢,i的值都會自增。”
聽到這裡,葉老滿意地點了點頭。
“小娃娃,看來你的基礎不錯,那你說說while循環和for循環除了語法還有什麼區別。
“這……”葉小凡一時語塞。
“小娃娃,你且看好,你方才寫的for循環中有一個小括號。小括號裡麵有3個表達式,分別為“var i=0”,“i<10”還有“i++”。第1個語句是在循環開始之前執行的,“var i=0”的意思是定義了一個變量i,是整數,初始值為0。第2個語句是“i<10”,表示進入循環體的條件。”
“循環體就是那個用大括號({})擴起來的部分嗎?”葉小凡問道。
“沒錯,不論是for循環還是while循環,循環體就是這個部分,這個部分裡麵的代碼是需要被多次執行的。現在我再給你說說最後一個語句“i++”,這個語句是在剛才我們所說的大括號裡麵的代碼被全部執行之後才會被執行的。一般來說,上麵這段語句裡麵的代碼可以控製循環變量i自增一個單位或者自減一個單位。”
“自增我知道,無非就是i++或者++i,為什麼要自減呢?”
“關於這個問題,是和第2個語句相關聯的。比如你剛才寫的代碼。”說著,葉老指向葉小凡剛才寫的代碼。
“你的循環判斷條件是當i<10的時候才會進入循環體,也就是後麵用大括號擴起來的部分,對吧?”葉老問道。
“沒錯,最開始的時候i=0,第一次循環中i自然是小於10的,於是就進入了循環體,像這樣。”說著,葉小凡催動內力,讓這段JavaScript代碼開始執行。
當執行到這一行代碼的時候,葉小凡特意讓代碼停了下來,調試代碼。效果如圖1-3所示。
“嗯,很好,我且問你,現在代碼停在了這一行,如果我再往下執行一步,那麼會到第4行還是停留在第3行呢?”葉老問道。
圖1-3 調試代碼效果圖(1)
“那還用問,肯定是跳到第4行啦。”葉小凡十分肯定地說道。
“先別著急下結論,走一步試試。”葉老對葉小凡說道。
“試就試。”說著,葉小凡就用debug走了一步。效果如圖1-4所示。
圖1-4 調試代碼效果圖(2)
“這是怎麼回事?”葉小凡訝然,同時皺了皺眉。
“你再走一步試試。”葉老笑嗬嗬地說道。
就這樣,葉小凡又走了一步,這才發現走到了第4行。經過反複測試,葉小凡緊皺的眉頭終於鬆開了。原來,第一次跳到第3行代碼的時候,是在準備運行for循環的語句1,也就是“var i=0”這句話。因此,剛才第一次跳到第3行代碼的時候,i變量的值是undefined(未定義),因為這個時候隻聲明了i變量,還沒有運行“i=0”這個賦值語句,所以是undefined。而當葉小凡往下再走一步的時候,則是運行了“i=0”這個賦值語句,這個時候,i變量的值才如願以償地變成了0,整個語句1才算是執行完畢了。為什麼再走一步就能夠跳轉到第4行代碼呢?這是因為語句1執行完畢後就自然會執行語句2了,也就是“i<10”這句話,這就好比是一個if判斷。
第一次循環的時候,i=0自然是小於10的,因此直接進入了循環體。循環體執行完畢後,開始執行語句3——“i++”,i從0變成了1,然後進入第二次循環,再次判斷i是否小於10。
聽著葉小凡的論述,葉老微微點了點頭,說道:“是這樣的,那麼問題來了,在剛才的例子中,i從0一直自增到10,當然,它最後會變成10,但是卻無法再次滿足i<10的判斷條件了。所以,當i=10的時候,就無法進入循環體了。可是這並沒有關係,因為第一次i=0是符合條件的,最後一次進入循環體是在i=9的時候,像這樣。”說完,葉老隨手一揮,將這段代碼的運行結果顯示了出來。效果如圖1-5所示。
圖1-5 運行結果
“嗯嗯,我明白了,因為i變量是從0開始的,所以0~9還是循環了10次。至於剛才說的自減,其實也是一樣的,隻要改變一下循環條件和初始化變量i的值就行了。”
說完,葉小凡修改了一下代碼。
for(var i= 10;i> 0;i- - ){
console.log(i);
“同樣是循環10次,這回就是變量i從10減到0的過程了。”葉小凡說道。
“沒錯,是這樣的。while循環隻是在語法上有所不同,其作用和for循環是一樣的。很好,看來你已經掌握了循環的奧妙。”
小結
for循環是你在創建循環時常會用到的工具。也就是說,如果某一段代碼需要多次執行,若不用循環,則需要將相同的代碼重複書寫多遍。
下麵是for循環的語法。
while循環會在指定條件為真時循環執行代碼塊。
下麵是while循環的語法。
1.10 對象內容的遍曆
“既然你現在已經知道了如何使用for循環,那麼現在我就來教你如何用這個技術遍曆一個對象。”葉老說道。
“對象裡麵無非就是屬性和函數,你的意思是給我一個對象,想辦法獲取它裡麵所有的數據(鍵值對)嗎?”
“沒錯,假設有這樣的一個場景:我需要判斷一個對象中哪些東西是屬性,哪些東西是函數。這就需要我依次獲取這個對象裡麵的所有東西,然後判斷誰是屬性、誰是函數。”
“等等,就算拿到了這些東西,怎麼才能判斷誰是屬性、誰是函數啊?我好像還沒有這方麵的法術。”
“不用擔心,這個很簡單,你隻需要用一個typeof關鍵字就可以了。比如,我現在有一個字符串和一個函數。”說著,葉老寫出了如下代碼。
“然後,用typeof關鍵字包裹一下,再輸出看看。”
console.log( typeof(a) );
console.log( typeof(fun) );
效果如圖1-6所示。“看到了吧,這樣就可以得到變量的類型了。a是一個字符串,所以typeof出來就是string;fun是一個函數,所以typeof出來就是function。接下來,我來跟你說說如何遍曆一個對象。首先,新建一個簡單的JavaScript對象。
圖1-6 運行結果
“然後使用for循環進行遍曆。”
“效果如圖1-7所示。這個for循環和之前的寫法是不同的。其中,p是一個隨便取的名稱,代表yeXiaoFan對象中遍曆出來的屬性名稱。通過這種方法,我可以在事先不清楚對象有哪些屬性的情況下把屬性的名稱都獲取到。”葉老緩緩地說道。
圖1-7 運行結果
“那麼除了屬性名稱,屬性的值也可以得到嗎?”葉小凡眨了兩下眼睛,好奇地問葉老。
“屬性名稱都得到了,你還愁沒有屬性值嗎?”葉老一吹胡子,笑嗬嗬地反問。
“啊,我明白了,既然有了屬性名稱,那麼對象可以用點(.)的方式直接獲取屬性的值。當然,用中括號([])也是可以的。”葉小凡恍然大悟。看到他如此表現,葉老也不禁點了點頭。
“沒錯,是這樣的。我們隻需要把剛才的代碼稍做修改就可以了。”說著,葉老又打出一段代碼。
運行結果如下。
“成了,可是你剛才為什麼不用點號?”葉小凡嘀咕道,可是轉念一想就明白了其中的緣由。因為遍曆出來的屬性名稱是不確定的,而是用一個p變量指代,既然是變量,自然不可以用點號。因為如果寫成yeXiaoFan.p,那麼就會被認為是尋找一個名字叫作p的屬性,然而事實上,p隻不過是一個變量的名稱而已。換句話說,p隨便叫什麼都沒關係,反正它隻是一個變量的名稱罷了,真正重要的不是p變量叫什麼,而是p變量指代的內容是什麼。
“我看到你的表情就明白你已經懂了,沒錯,你的猜想是正確的。一旦遇到這種屬性名稱不確定的情況,就隻能用一個變量代替,換句話說,不能用點號,隻能用中括號。因此,當對象訪問屬性的時候,用中括號是更加靈活的。”
“那麼,我是不是應該時刻都用中括號,再也不用點號了?”
“那倒不一定,有些情況,或者說絕大多數情況還是用點號。因為大部分的情況下,你都是已經明確知道屬性的名字叫什麼了,那麼毫無疑問,用點號是更加方便的,你說是吧。”
葉小凡想了一會兒,然後點了點頭。
1.11 外門小比
一轉眼,大半個月已經過去了,這段時間,葉小凡一有時間就會向葉老討教相關的JavaScript知識。憑借葉老的廣博見聞和技術底蘊,自然沒有問題。葉小凡也因此受益,這段時間他的功力突飛猛進。
“馬上就要到一年一度的外門小比了,聽說這次我們要和紫雲派的弟子進行外門小比。去年我們險勝了對方,對方一直不服氣,據說這次他們是有備而來的,而且培養出了一個天才少年,叫什麼簡南。”
“紫雲派超級新人簡南,不會是那個人吧?他年紀輕輕就已經被內定為下一代掌門的候選人,據說紫雲派這麼多年來就出了這一個資質絕佳的天才。”Ꮣ
葉小凡走在路上,時常聽到人們在議論這些事情。
“外門小比似乎有點意思,要是我能夠入選去參加比賽就好了,那樣也可以給門派爭光!”葉小凡想。沒想到,青山院下午就收到了通知,要求從新入門的弟子中挑選一位最具天資的人參加即將開始的外門小比。一石激起千層浪,新入門的弟子可不止葉小凡一個人,他們一個個都摩拳擦掌、躍躍欲試。
為了挑選出最為合適的人選,林元青特意在演武場召集了青山院的所有記名弟子,包括葉小凡在內,共計16人。要想獲取參賽的名額,就必須在這16人中脫穎而出。
演武場占地約2畝,是每個院定期切磋技藝的地方,16名弟子被安排在一塊用大理石砌成的場地上兩兩相對,即將進行參賽人的角逐。
“我是青山院的林元青,今日,我需要從你們中挑選出一個人參加即將到來的外門小比。比賽采用兩兩對決的形式,勝利的一方將進入下一場比賽,失敗者直接退出。”
這種比賽對於一些來看熱鬨的大弟子來說並不陌生,反正每年都是這樣搞的。前來觀賽的還有很多其他院的弟子,他們無非也是想來看看這一屆的新人中有沒有什麼特殊的。
“好吧,比賽開始,第一場的題目:運算符。請每個弟子根據自己的理解詳細概述運算符,然後由我評判誰可以晉級。”林元青淡淡地說道,隨後就身形一飄,繼而穩穩地出現在了裁判席。裁判自然不止林元青一個人,其他幾個院的掌尊今天也一並來了。
“什麼,運算符?”有些基礎不好的弟子聽到這個詞當即皺起了眉頭。
1.12 JavaScript運算符
題目一出,真是幾家歡喜幾家愁,那些複習得好的弟子自然可以侃侃而談,可是那些基礎薄弱的弟子立刻尷尬得說不出話來,甚至有的弟子已經舉起雙手表示要放棄比賽。這些舉動立刻引來了場外那些大弟子的哄笑。尤其是其他院的弟子,更是投來睥睨的目光。
林元青見此暗歎一聲,卻沒有特別失落。根據往年的經驗,青山院的生源都是最差的,學得好的人更是鳳毛麟角。因此,青山院的弟子行走在宗門,也總是要比別人低上一等。
“哈哈,不愧是吊車尾的青山院,今年果然還是老樣子,運算符這麼簡單的東西都能難住這麼多人。”
“就是啊,不過是運算符罷了,我看啊,青山院遲早退出內門,成為外門院係吧。”
第一場,是葉小凡和一個同門弟子之間的對決。
“快看,那個叫作葉小凡的據說才入門不久,依我看,運算符雖然簡單,可也不是這樣一個剛入門的愣頭青能夠理解的。”
“就是啊,這不,他現在的臉色可真是要多難看有多難看啊,哈哈。”
葉小凡沒有理會這些流言蜚語,而是眉頭緊鎖。倒不是說運算符這麼簡單的知識他不會,而是因為葉老這個BUG級的老家夥存在,他平時沒少給葉小凡灌輸一些比較深奧的功法和概念。因此,哪怕隻是簡簡單單的運算符,葉小凡也需要好好思考該如何概述。就在這時,對麵傳來了一陣傲慢的聲音。
“嗨,你就是那個什麼葉小凡吧?算你運氣不好,碰上了我。我可告訴你,在JavaScript基礎功法中,可沒有什麼功法可以難得住我。所以我勸你早點認輸投降吧。我看你對運算符也不是特別熟悉,何必在這丟人現眼呢,哈哈哈!”
葉小凡抬頭一看,隻見一個和自己年齡相仿的少年已經開始自信地解釋起來。
“JavaScript運算符,無非加、減、乘、除和賦值運算,何難之有?賦值運算符用於給JavaScript變量賦值。比如我現在有一個變量“var a;”,那麼這個變量的值就是undefined,因為沒有定義嘛。然後,我當然需要給它賦值咯。賦值的方法就是用“=”,把真正的值用“=”賦給它,這個就叫作賦值。加、減、乘、除自然不用多說,不就是最簡單的算術運算嘛。比如我有兩個變量,先用賦值運算符給它們賦值,然後計算加、減、乘、除。這樣吧,我寫一段代碼就全清楚了。”
“葉小凡,這段代碼你能看得懂嗎?我想你也是看不懂的吧。好了,本人就大發慈悲地跟你解釋一下。”
林元青注視著這一切,沒有多說話,根據演武場的規則,比賽雙方切磋技藝時可以互相給對方提問題,然後根據雙方的作答情況和問題的質量由評審團打出一定的分數。
“老林啊,看來這個弟子基礎還可以啊,而且還很自信啊。想必這應該就是你們院的最高水準了吧。”說話的是綠水院的掌尊尹曾琪,他平時和林元青的關係不太好,常常喜歡冷嘲熱諷。林元青笑了笑,並未答話。
“葉小凡,你可聽好了,我就說一遍。因為a=10,b=2,所以兩者加起來就是12。所以,s1=12錯不了。a-b=8,a*b=20,最後是除法,10除以2自然是等於5啦。”
“好,現在輪到我說了。你方才講得自然不錯,但是除了加、減、乘、除,還有3個運算符沒有說到。”葉小凡淡淡地說道。
“什麼?那你說說還有什麼運算符。”對麵的弟子急切地說道。
“首先是取餘數的運算符‘%’,取餘數的意思是一個數字除以另一個數字,除不儘的部分就是餘數。比如5除以2,得到的結果就是2.5。當然,0.5是小數,既然要取餘數,自然就不能寫成小數形式。5除以2,能夠被整除的就是2(5=2×2+1),餘下來1,因此餘數就是1。還有一種情況是小的數字除以大的數字,一個都不能被整除,比如2除以5,那麼餘數就是2本身。”
“啊,啊,是的,我正想要說呢,還有取餘運算符。”
“除了取餘運算符,還有自增運算符和自減運算符。自增運算符是++,自減運算符是--。顧名思義,自增和自減運算符可以使得當前的變量自增一個單位或者自減一個單位。這裡有一個需要注意的地方:不管是自增運算符還是自減運算符,它們都分為兩種,比如下麵這個例子。”
var a = 10;
var b = a++;
console.log(b);
“如果這樣寫,得到的結果你猜等於幾?”
“哼,這有何難,自增代表自增一個單位。既然寫了a++,那麼b自然就是11了,你當我傻啊,問我這麼簡單的問題。”對麵的弟子氣呼呼地說道。|
“錯了,答案是10。”葉小凡淡淡地說道,並且運功執行了這一段代碼,隻見得到的結果為10。
“這,這,怎麼可能?”對麵的弟子頓時驚呼道。
“對於自增運算符,它分為前置++和後置++。前置++就是在變量的前麵寫一個“++”,後置++就是在變量的後麵寫一個“++”,在剛才的例子中,就是後置++。後置++的特點是先讓變量參與運算,運算結束以後再進行自增。好,再看一下我剛才舉的例子。”
var a = 10;×լ
var b = a++;
console.log(b);
“尤其注意第2句。”葉小凡用手指著第2句“var b = a++”說道,“因為“a++”裡麵的“++”是放在後麵的,那麼這個是後置++。後置++的意思就是先把a原來的值放進式子裡麵運算,然後自增。也就是說,在這個賦值語句中,賦給變量b的值依然是10,而不是++後的11。”
“切,這有什麼難的,我剛才不過就是一時疏忽罷了。如果我現在把題目改一改,就是11了吧。”對麵的弟子在聽完後感到很不服氣,於是大手一揮,把代碼改了改。
var a = 10;ł
var b = ++a;ʟ
console.log(b);
寫完後,隻見他想了想,終於鼓足勇氣說道:“這個就是前置++了,++a的意思是先讓a的值自增一次,a本來是10,經過自增就變成了11。因為前置++的含義是先讓變量自增,再放進式子裡麵運算,所以這個代碼的結果就是11。”
說完,對麵的弟子開始運功,將代碼執行了一遍。果不其然,得到的結果是11。
“自然是這樣的,但是我現在這樣改一下,你說結果是多少呢?”葉小凡詭異地笑了笑,然後打出一段比較奇特的代碼。
var a = 1;
var b;
var sum = (b = a+++--a) + a-- + b++;
“噗!”看到這段代碼,對麵弟子差點一口老血噴出來,破口大罵:“葉小凡,你……你……你欺人太甚!”
“嗬嗬,這位師兄,這可怨不了我,再說了,互相切磋技藝也是演武場的規矩啊。”葉小凡回想起這段被葉老折磨的日子,再看到麵前這位弟子的表情,頓時開心了不少。其實這道題目就是平時葉老給葉小凡做練習的時候出的。
“這個小娃娃倒是有趣。”綠水院掌尊尹曾琪看到葉小凡竟然能出這樣的題,縱然是他也眼前一亮,不由稱讚道。當然,以他目前的修為,這種題目自然是難不住他的。但是很難想象,一個剛剛進入山門的小娃娃竟然有如此造詣,實在是讓人驚訝。
“這道題看似複雜,其實隻要一步一步拆分,也是可以分析和理解得很透徹的。”林元青微微一笑,看著葉小凡的目光中多了幾分期待。畢竟,葉小凡是他親自帶上山來的,他多少有一點印象,而且他也很想看看,葉小凡如何解答這道題。
“天哪,這種題目也太匪夷所思了吧。這個葉小凡真是不知道天有多高,地有多厚。”
“就是,就是,依我看呐,這根本就是那個葉小凡隨便瞎掰的一道題,我看他自己多半也做不出來。”
“哈哈,師兄說的是啊,就讓我們一起看看他如何出糗吧。”
場外有很多資曆比葉小凡高出不少的大弟子,他們剛才試著算了一下,但是馬上就自行放棄了,紛紛向葉小凡投來鄙夷的目光。但是,其中有一道目光卻充滿了嚴肅,這個人是一個和葉小凡年齡相仿的少年,旁邊有幾個功力深厚的年輕人跟隨著他。這時候,一個長相略顯老氣的人對該少年說道:“少爺,您是當今太上大長老最喜愛的長孫,資質和天賦也是我派數百年來的翹楚。依屬下看,這個葉小凡真是不知天高地厚,多半是隨便糊弄了一下,自己都不知道這道題怎麼解。”
隻見少年把手一揚,那名男子立刻不說話了。接著,他饒有興趣地看著葉小凡,這人便是門派內定的繼承人,門派中太上大長老最喜歡的長孫——羅丹。
1.13 語驚四座
“葉小凡,現在你把這道題解釋一下吧。”林元青看向葉小凡,穩重但不失威嚴地說道。
“是。”葉小凡麵朝著林元青作揖,然後抬起胸脯,緩緩道來。
“這道題看似複雜,但隻要一步一步細細分開,還是有跡可循的。”
var a = 1;
var b;
var sum = (b = a+++--a) + a-- + b++;
“首先,變量b隻是被定義了一下,並沒有賦值,在運行第3行代碼之前,b的值就是undefined,表示未定義。”
“嗯,繼續說。”
“弟子遵命,接下來就是第3行代碼。這一行代碼比較長,我試著把它拆分出來。首先是這一句。”
b = a+++--a;
“很明顯,這是一個賦值語句,a++是後置++,那麼就先把a的值放進去運算。這個時候,a的值還是1。但是,一旦a++結束,a的值就變為2了。換句話說,當執行到後麵的--a的時候,a的值就是2。”
“重點來了,又因為--a是前置--,意思就是先自減,然後放進式子中運算。剛才我們說到a的值已經是2了,那麼--a在這裡就變回了1。因此,這個表達式中,b最終的值就是1+1=2。”xl
“我這邊使用括號是為了讓變量b的賦值語句先進行運算。所以,b的值在後麵參與運算的時候就已經是2了。剛才a最後的值是1,那麼後麵的a--因為是後置--,參與運算的值還是1。因此,“(b=a++ + --a)+a--”的結果就是3,a--過後變成了0,不過後麵和a沒有啥關係了。最後一個是b++,由於是後置++,所以b變量參與運算的值還是2。那麼,最終的答案當然就是3+2=5啦。”葉小凡輕鬆地說著,似乎根本不覺得這是什麼困難的事情。
寂靜,一片寂靜。
就連對麵的弟子也聽得津津有味,場外的一眾大弟子個個屏住了呼吸,看著葉小凡,似乎自己還真的小瞧了這個剛進山門的小師弟。羅丹雙眼死死地盯住葉小凡,臉色出現了從未有過的凝重。
“嗯,不錯,你理解得很好。”林元青不吝稱讚,一種欣慰的感覺油然而生。ł
第一場比拚,自然是葉小凡獲勝。
1.14 秀
第一場比拚,葉小凡贏得非常漂亮,這難免遭到了場外一些大弟子的嫉妒。
“哼,不過才贏了第一場,有什麼好神氣的。”
“就是啊,不管怎麼說,運算符畢竟還是比較基礎的功夫。我看呐,這個葉小凡隻是運氣好,正好對這一塊比較熟悉罷了。”
第一場比拚結束,16進8,葉小凡成功晉級。第二場的題目是一道計算題:用JavaScript計算1+2+…+100的值。就在對麵的弟子還在埋頭苦算的時候,葉小凡已經完成了代碼。
在對手震驚的目光中,葉小凡不慌不忙地開始解釋。
“計算1+2+…+100的值,一個一個地加肯定不行,太慢了,效率太低。因此我想到了使用循環。for循環是一個不錯的選擇。for循環的格式是小括號裡麵有3個表達式,當需要進行for循環的時候,就先執行表達式1,也就是‘var i=1’。然後執行表達式2,即‘i<101’。表達式2是一個判斷條件,和if語句判斷有異曲同工之處。當表達式2的結果為布爾型的true時,就認為符合進入循環的條件,於是接下來就會執行‘{}’中的內容。”
sum = sum +i;
“在‘{}’裡麵是一個累加操作,把每次循環的i加到變量sum上去。當執行完這些代碼後,才會執行表達式3,也就是‘i++’,這句話的意義是讓i變量自增一個單位,好讓i一直慢慢變大,直到不符合進入循環的條件為止。”
聽到這裡,林元青微微點了點頭。葉小凡繼續說道:“我想這道題的考核要點就是對循環的了解程度。其實,這樣一道題目也可以用while循環解決。”說著,葉小凡又重新打了一段代碼。
“while循環和for循環的不同之處在於while循環隻有一個判斷表達式,就好比剛才for循環中的表達式2。至於for循環的表達式3,while循環已經放到‘{}’中了,表達式1則放到while循環之前了。”說完,葉小凡又寫了起來,過程沒有滯緩,猶如行雲流水,好像已經爛熟於心似的。
“嗯,做得不錯,這一場比拚自然還是葉小凡勝了。”林元青宣布比賽結果。
“啥?又贏了,這也太輕鬆了吧。”葉小凡心中暗驚,也難怪,葉小凡平時都是在葉老的指點下修煉,這種難度的題目實在是有點小兒科了。
葉小凡二連勝,8進4!
1.15 天秀
下一題的內容是JavaScript數組,比賽雙方需要說出自己對於數組的理解,最後由掌尊林元青判斷誰可以勝出。聽到這個題目,葉小凡差點笑出了聲,關於數組,他自己都不知道已經和葉老那個老怪“交流”多少回了。雖然不知道自己對於數組的掌握有多深,但是葉小凡依然有著十足的信心。於是,就在對手還在冥思苦想的時候,葉小凡已經滔滔不絕地講述了起來。
“在JavaScript中,數組是一個非常靈活的類型。簡單來說,數組就是一個容器,可以存放一個或者多個對象。當然,這些對象的類型是沒有限製的,不管它是什麼,數組都可以存放。”葉小凡非常淡定地說道,中間沒有絲毫停頓,好像這些話早已融入他的靈魂深處一樣。
“嗬!說得好像你很懂似的,姓葉的,你倒是先說說數組該怎麼創建吧!”對麵的弟子不屑一顧地說道。對於數組,他雖然不敢說非常精通,但是多少有點了解。更關鍵的是,他自己可是比葉小凡早入門許久,當然不認為自己會比葉小凡這個新人差,他已經準備好了,計劃隨時打斷葉小凡的講述。
“數組有4種定義方式。”葉小凡隨即講道。
“什麼,4種?笑死人了,我倒還是第一次聽說,數組不就是用一對中括號就可以定義了嗎,哪來的4種?”對麵的弟子不屑地笑了笑。
“你說的是用直接量定義數組。”葉小凡繼續說道,“所謂直接量定義,就是用一對中括號聲明一個數組對象,就像這樣。”
var arr = ["first", "second", "third"];
console.log(arr);
“得到的結果就是生成了一個擁有3個元素的數組對象,對象的名字是arr。這種方法的好處是在定義數組的時候可以直接對這個數組進行初始化。除了這種方法,還有其他三種方法,我先來說第二種。”說著,葉小凡就打出了一句代碼。
var a = new Array();
“這是采用構造函數的方式創建的一個數組對象,在JavaScript中,每個類型其實都有一個函數作為支撐,數組也不例外。在這個例子中,Array也叫作構造函數。與第二種方法類似,還有兩種方法也是采用構造函數創建一個數組對象的。”
var b = new Array(8);
var c = new Array("first", "second", "third");
“這三種方式有著各自的特點,第一種是直接用構造函數創建一個空的數組,也就是說,這個數組裡麵什麼都沒有。數組天生就擁有一個length屬性,我可以讓這個a變量調用自身的length屬性以驗證這一點。”
var a = new Array();
console.log(a.length);
代碼運行後,眾人看得清清楚楚,結果是一個“0”。
“相信各位也看到了,這段代碼的結果是一個0,表示當前的數組對象裡麵啥也沒有。接下來看第二種方式。”
var b = new Array(8);
“這種方式和剛才那種方式的不同點就在於,它雖然也是創建一個數組,但是卻在創建的同時設置了一個初始的長度,大家看,Array是一個函數,new關鍵字表示創建這個函數所表示的對象,因為是函數,所以自然是可以打括號的。沒錯,函數可以打括號,打括號的意思是執行這個函數的函數體。函數是有參數的,這個‘8’就是參數。在這個例子中,‘8’表示給數組對象添加一個初始化的長度,我依然可以用數組的length屬性驗證這一點。”說著,葉小凡繼續打出代碼。
var b = new Array(8);
console.log(b.length);
代碼運行後,眾人看得清清楚楚,結果是一個“8”。
“相信各位也看到了,這段代碼的結果是‘8’,表示當前的數組對象裡麵已經有8個元素了。那麼問題來了,我並沒有給這個數組添加任何東西,最起碼看起來沒有。那麼,這8個元素到底是什麼呢?這個待會再說,先看最後一種方式。”
var c = new Array("first", "second", "third");
“這種方式在創建數組對象的同時就給它賦予了初值。簡單來說,就是在創建數組的時候給它添加了3個元素。正因為如此,這個數組當前的length屬性已經有值了,而且就是其裡麵元素的個數——3。”
var c = new Array("first", "second", "third");
console.log(c.length);
代碼運行後,眾人看得清清楚楚,結果是一個“3”。
“什麼,葉小凡,你竟然連函數都知道了!”對麵的弟子瞪大了眼睛,一臉的難以置信,要知道,在JavaScript初級階段,函數可是一門了不起的法術!雖然也有一些悟性好的弟子提前對函數有了一知半解,但是大部分初級弟子都是無法駕馭函數的。
“還是繼續講講數組吧,剛才我說了創建數組的4種方式,第一種是用直接量創建數組,剩下的3種都是用構造函數創建數組。其實用起來的話,還是第一種方式最好用,它是最簡單的一種方式。”
“嗯,說得好,關於數組的創建,葉小凡說得算是比較通透了。”林元青也滿意地點了點頭,場外的弟子又是一陣喧囂。
“剛才你還說到數組的length屬性,那是什麼?”對麵的弟子收起了對葉小凡的輕視,皺著眉頭問道。
“哦,你說的是length屬性,數組隻有一個屬性,就是length。length表示數組所占內存空間的數目,而不僅僅是數組中元素的個數。比如,我可以定義一個長度為8的數組,但其裡麵卻隻有一個元素,就好像下麵的代碼。”
var b = new Array(8);
“變量b指向一個數組,這個數組所占的內存空間為8個單位,也就是說,有8個位置可以讓這個數組存放其他元素。雖然我現在還沒有給這個數組添加任何元素,但是並不代表這個數組沒有長度,而這個長度就是數組的length屬性。”
“那這個數組內部到底有什麼?”
“這個數組的內部就是8個空元素,沒有東西,但是占據了內存空間。”說著,葉小凡打出一段代碼進行驗證。
var b = new Array(8);
console.log(b);
代碼運行後,眾人看得清清楚楚,結果是[<8 empty items> ]。
“原來如此。”對麵的弟子也佩服起葉小凡來。
“數組作為一個對象,有著很多內置的方法,接下來就說說那些有趣的方法吧。”
1.16 數組方法
“首先是push方法,它可以把一個元素添加到數組裡麵。把數組想象成一個長長的盒子,我如果想要給數組添加新的元素,就可以用這個方法。”說著,葉小凡打出一段代碼。
var b = new Array(8);
b.push("蘋果");
b.push( "香蕉");
b.push( "牛油果");
console.log( b);
運行結果如圖1-8所示。
圖1-8 運行結果
“如果直接用push方法,那麼元素就會被添加到數組的尾部,而且原來的8個位置無法占用,會直接跟在後麵。”
“怎麼會這樣?那前麵的8個位置難道就沒有用了嗎?這樣豈不是很浪費?”對麵的弟子大感不解。
“用push方法確實沒有辦法做到,但是要想利用前麵8個位置,還是有辦法的,那就是用數組本身寫一個數據,比如這樣。”說著,葉小凡打出了一段代碼。
運行結果如圖1-9所示。
圖1-9 運行結果
“大家請看,數組本身有寫數據的能力,隻要給數組變量加上一對中括號,然後在中括號裡麵寫上對應的下標位置,就可以給對應的內存空間塞入數據啦。”
“當然,如果我要修改某一個位置的數據,也可以用同樣的方法。”說著,葉小凡打出了一段代碼。
運行結果如圖1-10所示。
圖1-10 運行結果
“像這樣,在下標位置相同的地方重複賦值,就可以修改數組元素啦。”
“那怎麼才能刪除數組中的某一個數據呢?”對麵的弟子又問道。
“刪除數據需要用到數組的splice方法或者pop方法。”葉小凡想了一會,堅定地說道,“先說pop方法,這個方法可以刪除數組尾端的元素。”說著,葉小凡打出了一段代碼。
運行結果如圖1-11所示。
圖1-11 運行結果
“很顯然,剛才數組的最後一個位置的元素是‘牛油果’,但是現在已經沒有了。pop方法會默認刪除數組中的最後一個元素。可以這麼認為,先進入數組的後刪除,後進入數組的先刪除。剛才我說到,刪除數組元素的方法有兩種,pop方法隻是其中一種,還有第二種,就是splice方法。splice方法的作用是插入、刪除或者替換數組元素,它不僅會在原有的數組上進行修改,還會返回被處理的內容,因此這是一個功能強大但不容易使用的方法。splice方法用前兩個參數進行定位,餘下的參數表示插入部分。”
“什麼叫用前兩個參數進行定位?”
“比如我現在有一個數組[1,2,3,4,5],splice方法的第一個參數代表需要操作的數組的起始位置,比如你要刪除數組中的某一個元素,那麼你必須確定從數組中第幾個元素開始刪除,因為數組的下標位置默認從0開始,所以假如要刪除數字3,就需要從數組下標為2的地方開始刪除。然後,splice方法的第二個參數代表要刪除元素的個數,如果我隻刪除一個數字3,那麼隻需要在第二個參數的位置填入1即可。”說著,葉小凡打出了一段代碼。
var a = [1,2,3,4,5];
a.splice(2,1);
console.log(a);
運行結果為[1,2,4,5 ]。
“如果我要刪除3和4兩個數字,則需要把第二個參數替換成2就可以啦。”
var a = [1,2,3,4,5];
a.splice(2,2);
console.log(a);
結果為[1,2,5 ]。
“那如果要把數字3替換成數字38,並且再在38的後麵加一個元素66,又該咋辦?”對麵的弟子又問道。
“那也簡單,我剛才說了,splice方法用前兩個參數進行定位,餘下的參數表示插入部分。要把3替換成38,思路就是先把3刪掉,然後在後麵加上一個38就可以了。如果後麵還要加66,則再多寫一個參數66。”說著,葉小凡打出了一段代碼。
var a = [1,2,3,4,5];
a.splice(2,1,38,66);
console.log(a);
運行結果為[1,2,38,66,4,5 ]。
全場寂靜,誰都難以想象,葉小凡不過是一個新人,竟然能夠對數組有這麼高深的理解,這掌握得豈止是全麵了?
過了好一會兒,對麵的弟子似乎不甘心,又問:“我以前見過有的師兄把數組轉換成了一種字符串,你會嗎?”
“你說的是數組的join方法吧,join方法可以把數組中的所有元素放入一個字符串。元素是通過指定的分隔符進行分隔的,而這指定的分隔符就是join方法的參數。比如,我可以把數組裡麵的所有元素轉換為用逗號分隔的字符串。”說著,葉小凡打出了一段代碼。
var arr = [1,2,3];
var str = arr.join(",");
console.log(arr);
運行結果:1,2,3。
正當葉小凡還要介紹數組的其他方法時,林元青淡淡地說了一句:“可以了,這一局,葉小凡勝!”
葉小凡三局連勝,進入決賽!
1.17 蒂花之秀
葉小凡甚至都沒有出力,就已經輕鬆進入了決賽,能進入決賽的對麵弟子,自然也是有著驚人的天賦和能力,但是這一切對擁有葉老指點的葉小凡來說,實在是不值得一提。
“現在進入決賽,題目是:函數!”林元青嚴肅地宣布了決賽題目。
“什麼?竟然是函數!天哪,這不是JavaScript中比較高級的技術嗎?真沒想到,最後一題是函數啊!”
“是啊,不要說這幫新人,就算是已經在門派中曆練了好幾年的弟子,也不敢說可以輕而易舉地駕馭函數啊!”
場外的大弟子們紛紛唏噓。的確,函數對於新人來說確實有點難了,這一點是公認的。其實林元青也沒指望這幫孩子能夠對函數有多麼深刻的理解,隻是想看看有沒有人知道函數這個概念,若是能夠自己編寫一個或者兩個函數,那自然是再好不過了。
“老林啊,你這題可是有點難為人啦。”尹曾琪笑著對林元青說。
對麵的弟子看著葉小凡,搶先開口:“函數是一組可以被重複調用的代碼語句,格式是這樣的。”說著,隻見他打出了一段代碼。
“我剛才定義了一個函數,函數的定義需要用到function關鍵字,然後空一格,再加上函數的名字。剛才的代碼中,函數的名字就是test,葉小凡,想必你也看到了在test函數的右邊我還打了一個小括號,這個小括號裡麵是用來放參數的。也就是說,函數裡麵如果需要用到一些從外麵傳進來的數據,就可以通過參數變量做傳遞。最後就是函數體了,用大括號擴起來的部分就是函數的函數體。在函數體中可以編寫多條JavaScript代碼,當然,因為隻是舉一個例子,所以我的函數裡麵隻寫了一個最基本的alert語句,隻會彈出一個窗口罷了。接下來,我需要調用函數。”
對麵的弟子發力,又打出了一段代碼。
代碼成功運行,眾人看得真切!
“哈哈哈,葉小凡,看到了吧,這就是函數調用,函數的調用方法就是在函數名稱右邊加一個小括號,表示要去執行函數的函數體了。我剛才編寫的函數裡麵隻有一個alert語句,那麼調用這個函數的效果就是執行alert語句。”
“葉小凡,你認輸吧!能夠被我打敗,也算是你的榮幸了!”對麵的弟子笑嗬嗬地對葉小凡說道。
葉小凡聽到後,隻是微微一笑,不急不躁地來了一句:“很好,接下來輪到我說了。首先,函數分為七重關!”
全場一片寂靜。
1.18 函數七重關之一(函數定義)
“這小娃娃真是好大的口氣,一口氣說函數有七重關,老夫要好好品鑒一番。”尹曾琪目露精光,口氣中帶著一絲嘲諷,卻也有一絲好奇。
林元青也被葉小凡的話嚇了一跳,全場更是炸開了鍋。
“這個葉小凡,說話還真是狂妄,什麼函數七重關,我倒要看看他能夠說出個什麼來!”
羅丹麵色凝重,眼睛更是一下不眨地盯著葉小凡。葉小凡也愣了一下,這實在是怨不得葉小凡,這函數七重關,可是葉老親自教導自己的。在平時和葉老的交流中,葉小凡也早已習慣把“函數七重關”掛在嘴邊。誰知道,自己把“函數七重關”一講,會引起這麼大的轟動!
“好,葉小凡,你就說說,你所謂的‘函數七重關’究竟是什麼吧。”林元青也微笑著搖了搖頭,對葉小凡說道。
“是,弟子遵命。函數七重關的第一重關,自然指的是函數的定義。”葉小凡小聲說道。
“函數的定義需要用到function關鍵字,定義函數的語法方才這位師兄已經講過了,我不再贅述。隻是需要提一下,除了剛才那位師兄提到的定義函數的方法,其實還有另一種方法。”說著,葉小凡隨手打出了一段代碼。
“這是第一種定義函數的方法,也是最常用的方法。哦,對了,裡麵的document.write方法表示用JavaScript向頁麵輸出一段話。接下來,我再講講第二種方法。”說著,葉小凡又隨手打出了一段代碼。
“這便是第二種定義函數的方法了,和第一種方法有所不同,第二種定義函數的方法需要先定義一個變量,比如‘var a’,然後還是用function關鍵字定義一個函數,再把這個函數賦值給變量a。因為最後要賦值給變量a,因此這裡在定義函數的時候就不需要加上函數的名字了,這就是其中的一個區別。用這種方法定義出來的函數,函數的名字就是變量的名字,也就是說,我要想調用這個函數,就要這樣做。”
a();
“嘩眾取寵,這兩種方法在本質上沒什麼區別,不都是一樣嗎?”對麵的弟子對葉小凡的講解嗤之以鼻。
“這自然是有區別的,剛才我講了第一個區別,現在說第二個區別。第二個區別就體現在函數的調用上。”說著,葉小凡又隨手打出了一段代碼。
“這位師兄,你說我這段代碼可以成功調用函數a嗎?”
“你這不廢話嗎,當然可以了!”
“好,那師兄請看。”葉小凡開始執行代碼。
Uncaught TypeError: a is not a function
眾人看得真切,代碼居然直接報錯了!對麵的弟子瞬間不說話了,場麵一度有點尷尬。
“如果是用第一種方法定義的函數,把調用語句放在前麵,則可以成功調用。”
代碼運行後,成功在頁麵上打印出:This is My First Function!
眾人一下子又炸開了鍋,有的大弟子一臉的難以置信。就連尹曾琪也對葉小凡稍顯關注,場外的羅丹麵色則更加凝重。
“導致這種情況的原因是,如果是用第一種方法定義的函數,它會被提前加載,因此調用語句可以寫在函數的定義之前,因為那個時候函數已經被加載完畢了。而用第二種方式定義的函數是不會被提前加載的。換句話說,必須要執行到函數定義的語句才會加載這個函數,正因為這個道理,剛才的代碼才會直接報錯。因為在調用a函數的時候,a函數還沒有加載,強行調用一個不存在的函數自然是不被允許的!”
“接下來,我再舉一個例子說明這個情況吧。”說著,葉小凡又隨手打出了一段代碼。
代碼運行後的結果一如葉小凡所言,第一個a打印出來是undefined,表示未定義。第二個a打印出來就是具體的函數了,說明這個時候函數a已經被加載完畢!
“我有問題,為什麼第一個a打印出來是undefined,而不是直接報錯呢?”對麵的弟子疑惑地問道,接著他又侃侃而談:“我之前遇到過這種情況,就是引用一個從來沒有被定義過的變量,得到的結果是直接報錯的!比如這個。”
console.log(apple);
ReferenceError: apple is not defined
“看吧,這樣寫的話就直接報錯了,因為我從來沒有在任何地方定義過一個apple變量。你剛才調用了一個還未被加載的函數,為什麼會打印出undefined而不是報錯呢?”
“是啊,這是為什麼呢?看看葉小凡怎麼說。”場外又竊竊私語起來。
“你混淆了概念,函數有沒有被加載與變量有沒有被定義是不同的事情,不要放在一起談論。就比如說我剛才打的代碼。”
“注意看,函數有沒有被加載,可以看成function有沒有被賦值給變量a。從代碼上來看,自然是沒有的。因為‘console.log’語句是寫在‘var a =function(){’的前麵啊,也就是說,當調用變量a的時候,變量a並沒有被賦值。但是不管變量a有沒有被賦予一個funciton函數,我就問你一個問題,a有沒有定義?”ᒝ
。氣服不的臉一子弟的麵對”!啊到行運被有沒並它是可,了義定是義定,個這,額“
。問疑的樣一過有也他,候時的關重七數函輸灌他給老葉在為因,亂慌有沒毫絲,道說地淡淡凡小葉”。了製機行運的碼代tpircSavaJ到說要就這“
理原譯編tpircSavaJ 91.1
。情表的揍欠臉一,氣口的輩長著學凡小葉”。了長話來說就可那,製機行運的碼代tpircsavaJ到談“
”!吧說短話長就你那“:道說著笑,了去下不看些有都青元林連就
。碼代段一了出打就手隨凡小葉,著說”。子例的單簡最個一看來先。命遵子弟,是“
;01 = a rav
。煩耐不些有到感子弟的麵對”?懂不看誰碼代的單簡麼這,嗎我逗在是這你,凡小葉“
。道說地慢不緊不凡小葉”。驟步個三有譯編而,程過的譯編個一過經會前之行運在碼代tpircSavaJ?嗎理原的部內它道知你是可,句語義定的單簡個一是就非無這,錯沒,急別先你,兄師“
。法說個這到聽次一頭是也他的尊掌為身為因,趣興了來也琪曾尹”?驟步個三哪是說說好好可你,娃娃小,哦“
l”。’;、2、=、a、rav‘是就果結的到得麼那,驟步的詞分過經果如,子例的才剛如比。塊碼代的義意有個個一為解分碼代些這把是的目的詞分,的成組話句句一由是就實其碼代tpircSavaJ,詞分是驟步個一第“
”。備準的碼代行執要了好做刻立後然,譯編了成完經已就候時的碼代段這行運們我在早擎引tpircSavaJ實其但。在存的譯編到不覺感就本根們我,了短太是在實程過譯編的’;01=a rav‘。子例的才剛如比就。在存的譯編到不覺感本根們我說者或,的生發時同是行運和譯編,看地觀直以所。內之間時的短更至甚秒微幾的前行執碼代在就般一程過的譯編其,性殊特的言語程編門這tpircSavaJ於由,是但。輯邏碼代行執擎引tpircSavaJ過通後然,別識被以可才碼代的後之譯編有隻,譯編行進其對器譯編tpircSavaJ過通要需就,碼代tpircSavaJ行運想要,的行運接直法辦有沒是碼代tpircSavaJ,說來單簡。)TSA(樹法語的象抽棵一成生,析解行進塊碼代個個一的到得詞分才剛對器譯編tpircSavaJ由,析解是驟步個二第“
”?啊麼什是樹法語象抽的說你那“
。道說地慢不緊不凡小葉”。句語算運和句語明聲、句語值賦到位定地準精以可樹棵這作操過通,身本碼代了義定樹法語象抽“
”。樹象抽棵一為析解它把器析解的tpircSavaJ過通們我。句語的義定個一是也這,然當,句語值賦個一是這,顯明很,碼代的才剛說說來再“
樹象抽 21-1圖
。示所21-1圖如果效
”。奧玄麼什有還麵裡看看,點節子個這開展們我讓,在現。明聲的量變個一行進是的目的序程,序程個一是話句這’;01 = a rav‘,了白明很就這,哦。明聲量變是就思意,noitaralceDelbairaV著寫地楚楚清清麵上,點節子個一的一唯是也個一第的麵裡序程個這看後然。序程個一是碼代的寫們我表代,ydob margorP著寫地楚楚清清麵上,端頂的樹棵這是就也,點節大的層頂最是先首,看來個一個一們我讓“
。示所31-1圖如果效
”。吧題問麼什有沒該應,步一這到想我,量變個一明聲字鍵關rav用示表,類種表代dnik。量變個一了明聲隻句語個這示表,1個一了寫麵裡號括中,組數明聲是]1[snoitaralced。dnik是個一另,]1[snoitaralced是個一,點節子個兩含包中點節noitaralceDelbairaV在“
。示所41-1圖如果效
)1(點節子開展 31-1圖
)2(點節子開展 41-1圖
l”。點節子個一有隻也麵裡後開展此因,明聲個一有隻麵裡示表’]1[‘,]1[snoitaralced是點節父個一上為因正,明聲量變示表也它,點節rotaralceDelbairaV個一有現發,點節]1[snoitaralced開展續繼“
。示所51-1圖如果效
”。a量變給賦01將是它,出看能也上句語從,作操化始初的量變示表tini。a是就也,名量變的們我表代,符識標是reifitnedi,名量變表代di,點節子個兩tini和di為分麵裡到看以可,了息信體具的明聲量變到看於終,好“
。下一了釋解resraP tpircSavaJ用且並,碼代段一出打又後隨,子關個了賣,笑一嘿嘿凡小葉”?樣怎會看看,a給值賦01把不,下一換碼代把我果如“
。示所61-1圖如果效
)3(點節子開展 51-1圖
)4(點節子開展 61-1圖
”。麼什生發會a量變個一出輸果如看看們我,來下接。denifednu是值的a量變,候時的行執碼代在,上際實。空的上義語是而,llun型類據數的麵裡tpircSavaJ為解理要不llun的裡這:意注。空表代llun,值始初個一賦a量變給會也器釋解的tpircSavaJ麼那,值賦a量變給有沒果如“
;a rav
;)a (gol.elosnoc
。示所71-1圖如果效
ᒑ”。樹法語象抽的句語式達表個這看看來們我麵下。句語用調的數函個一是就這,說來體總。法方gol了入傳數參為作a量變,法方個一的象對elosnoc是gol,象對置內個一是elosnoc。碼代tpircSavaJ行一的上義意遍普是就句語式達表。)句語式達表(tnemetatSnoisserpxE——實果的新個一了出結又,上樹法語象抽的成生在。句語出輸gol.elosnoc個一了多中碼代,同不才剛和在現“
)5(點節子開展 71-1圖
樹法語象抽 81-1圖
。示所81-1圖如果效
”。方地的在所a量變了在儲存01字數將後最,量變個這放存以存內些一配分後然,區量變在放並量變的a作叫個一了建創,令指器機些一是就的來出成生終最許也。碼代的行執可是就,錯沒?呢麼什成換轉,換轉行進樹法語象抽的成生中驟步個二第在把會擎引tpircSavaJ,中程過個這在。成生碼代是就,驟步個一後最講來下接“
。證驗和試調行自上lmth.esrap/omed/gro.amirpse//:ptth站網在以可建創的樹法語象抽:示提小
)域用作(二之關重七數函 02.1
。了心於熟爛就早下導教的老葉在念概些這,著解講續繼凡小葉”。關重二第的麵裡關重七數函的結總所我是便這。說一說再念概的域用作把須必我,題問的前之答回想要。了說短話長續繼我那,咳咳“
”。子例的單簡較比個一看先,域用作局全於關。段階詞分作叫也段階法詞,以所。詞分——驟步個一第的碼代譯編tpircSavaJ的說所才剛是就段階法詞。段階法詞在義定被都,域用作數函是還域用作局全是管不。域用作是就,圍範的找尋個這。量變個這到找內圍範麼什在以可你,候時的量變個一某找查要你當指是就,域用作謂所。域用作數函是種一另,域用作局全是種一,種兩為分域用作,中tpircSavaJ在。吧題問的域用作明說話的俗通用就我,的懂難澀晦和雜複較比是還,究深要果如域用作,先首“
”。子例的才剛看請。行不來過反是但,量變的中域用作局全問訪以可麵裡域用作數函在。域用作數函個一了套嵌麵裡域用作局全,說是就也。套嵌的域用作個一了成形就,來一樣這麼那,域用作數函個一有擁又己自它而,域用作局全於屬數函tset為因又。域用作數函於屬都體數函的數函,錯沒。域用作數函是則分部的來起包號括花用即,體數函的數函tset而。域用作局全於屬都們它此因,麵外在露暴接直都數函tset和a量變“
”。樣這如比,行不就來過反是但。啦a量變的麵外問訪以可就,候時的體數函行執在,麼那。a量變個一有實確中域用作局全是就也,域用作級父的麵外,出看難不子例個這從,麼那。找尋中域用作級父的它著包層一上去就,到不找果如。a量變個一有否是找尋麵裡域用作數函前當去先會a的麵裡域用作數函,中子例個這在。01是然必案答,數函tset用調接直我果如“
。下如果結行運碼代
。碼代段一了出打就手隨凡小葉,著說”。套嵌域用作是不就式形種這麵下,如比。的言而域用作數函他其和域用作數函是者或,域用作數函和域用作局全對針是般一套嵌域用作是就那,點一意注要需且而。的麵裡問訪法無的麵外,的麵外問訪的麵裡能隻,候時的套嵌域用作生發當此因。的到不做是卻量變的義定中域用作數函用調要想域用作局全,話的來過反是但。量變的麵裡域用作局全問訪以可麵裡域用作數函在,域用作數函個一著包域用作局全,了說經已才剛“
。02是果結行運碼代
”。a量變的麵裡域用作局全為同問訪以可然自法方gol.elosnoc麼那,麵裡域用作局全在是都然既。解理便方更樣這,域用作局全於屬也a的裡這為認以可你,域用作數函和域用作局全有隻,中tpircSavaJ在,了說也才剛我且而。套嵌域用作算不此因,數函現出有沒並裡這是但,麵裡號括花了在寫義定的a量變然雖“
。啊他導教在老葉的別級怪老個一有,竟畢,多子弟他其比識知的懂凡小葉怪難也。頭點了點微微也琪曾尹和青元林是饒,據有理有得講凡小葉
ʟ”。下一換碼代把我,來下接“
”?呢少多是來出印打a的麵下,說你麼那,eslaf了為改eurt的中斷判fi把在現我,瞧“
。道說地定確很是不,想了想子弟的麵對”。啊了行執會不句語的a量變義定為因,吧錯報是該應,這“
!denifednu是果結的到得,下一了行執碼代將功運,笑一微微凡小葉”。好看你,了錯“
。呼驚子弟的麵對”?麼什為,denifednu是然竟?麼什“
”。denifednu是就值的a量變取獲此因,量變個這問訪以可然依法方gol.elosnoc以所,麵裡域用作局全在是而,中體數函的數函個一某在是不a量變為因又。denifednu個一它給認默會統係且並,取獲被會然依a量變,段階析解和段階詞分的碼代在,段階行運在是碼代行執,是但。行執會不確的話句這以所,eslaf是件條的斷判fi而,中斷判fi在話句這’;02 = a rav‘“
”。了題問個那的前之釋解以可來下接“
”。了句語值賦個一是就來下接。denifednu是就的來出印打次一第,以所。denifednu個一它給認默且並,域用作局全入放並來出取提它把會是還擎引tpircSavaJ是但,數函個一為值賦被有沒還a量變,候時的法方gol.elosnoc行執次一第“
”。數函個一是的來出印打以所,了值有經已然自a候時個這,法方gol.elosnoc個二第行執來下接。數函個一是而,了denifednu是再不就a,行執旦一話句這。了生產經已就數函的a作叫字名個一,說話句換,數函個這了向指就a量變此從麼那,a量變了給賦數函名匿個一把句語值賦個這“
。采神分幾好了多顯明中光眼的凡小葉向看他,賞讚吝不力實的凡小葉對然顯,好個三說連琪曾尹”!好!好!好“
。前眼人眾了在示顯就碼代段一,揮一手隨琪曾尹,著說”。考一你考來再就夫老麼那,域用作數函和域用作局全為分域用作了到提你然既。解了此如數函對以可然竟,紀年小小你到想沒,娃娃小“
”?呢麼什是案答,看看答回來你題道這“
”。設擺個一是就實其a量變的麵裡域用作局全,以所。了a量變找尋麵裡域用作局全去會不就麼那,了到找經已然既。denifednu是就a麼那,值賦有沒是但,a量變個一了義定麵裡數函tset。了到找現發果結,找尋麵裡域用作的數函tset是就也,域用作級父的它在,層一翻上往就麼那,到不找麵裡域用作數函前當在然既。到不找現發卻果結,找尋麵裡數函renni在先優會就,量變個一問訪中數函renni的麵裡最在麼那,域用作數函了套嵌麵裡域用作數函在是這,denifednu是案答“
。答回的凡小葉了可認,頭點點琪曾尹”?樣怎會遞傳數參有數函果如說說再你那。錯不得答回,子小好“
。子弟個一同讚樣這在現像會少很,頭骨挑麵裡蛋雞歡喜都試考次每,苛嚴的名了出是可琪曾尹,中派鶴千在,道知要,了騰沸又子下一眾觀的外場
”。關重三第的麵裡關重七數函了為結歸它把是我實其,參傳的數函於關。命遵子弟“
。濃更意之賞讚,笑大哈哈琪曾尹”!吧關重三第的你講講就你那。好,好,好,哈哈哈“
。關重三第了起講始開就,後意授到得,眼一青元林了看頭抬凡小葉
)遞傳數參(三之關重七數函 12.1
。碼代的麗絢段一了出打手隨凡小葉,著接”。來過傳值的樣麼什有會中程過的用調道知不並候時的數參義定在們我,說是就也,值的來進傳會候時的用調數函當指是就,數參的謂所“
。6是果結行運碼代
。好最意知名見夠能,然當,的取便隨是名量變的量變個三c、b、a,候時的數函個這義定在。量變個三c、b、a的內表列數參是就也,內號括圓中數函dda應對別分數參個三這,3、2、1是別分,數參個三了去進傳候時的數函用調。法加做是的目的它白明夠能就數函dda看一,中子例個這如比。思意麼什是道知就看一人讓要義定字名的數函,說來般一。子例的遞傳數參上配用調數函的單簡最個一是就這
”。碼代的麵下像就,數參個三入傳須必就,數函dda用調要你果如,說話句換。c、b、a是別分,數參個三要需用調的數函dda,中子例的才剛在“
;)3 ,2 ,1 (dda
”。分部個這麵下是就也,體碼代的麵裡數函行執會就樣這,號括小對一上加邊右的字名數函在是就用調的數函“
”。行一第是先首,情事麼什些了生發都麵裡體數函的數函個這下一看來們我在現。範規寫編的碼代tpircSavaJ是這,號分個一打要就,句一完寫每。了行就碼代tpircSavaJ寫常正麵裡在,的來起擴號括花用是都般一體碼代的數函“
;c+b+a =musrav
”。來出印打上台製控在量變mus把是就,句語印打個一是麵下。mus量變部局給賦)符算運值賦(號等用量總個這把後然,量總個一到得後之加相量變個三c、b、a把是就,出看以可也上麵字的碼代從。了值賦和法加的單簡個一是就來下接,看續繼,好。量變部局作叫被也它,問訪被內體數函的數函該在能隻量變mus個這,以所。的量變mus的麵裡域用作數函問訪接直法辦有沒是域用作局全的麵外,說是就也,間空的閉封對相個一是域用作數函,的麵裡域用作數函在義定是量變個這,定限圍範的域用作據根,的部內體數函的數函dda在義定是量變個這,意注,量變的義定新個一是mus“
。道問子弟的麵對”?辦咋數參個一了傳就候時的數函用調在我果如那“
”。的似類是題問的你和況情的樣這,傳有沒都數參個一卻候時的參傳是但,數參個一了置設,數函個一了義定我,如比。看來出分拆獨單它把以可想我,題問個這的說你,嗯“
”。看說說你那?哦“
。碼代段一出打便,下一了想凡小葉”。的好“
”。樣這像就,數參寫不意故且而,數函個這用調著試要我,來下接。已而句語印打條一了寫中體數函的數函個這在是隻我以所,試測是隻為因。以可也數函個一另是怕哪,象對個一是以可至甚,字數個一是以可也,串符字個一是以可它,的定限有沒是麼什是底到a個這,然當,a是字名數參,數參了置設數函個這。吧nuf它叫就,的取便隨我是字名數函,數函的單簡個一是這“
;)(nuf
。碼代了行執後然,子關個了賣意故凡小葉”。知便下一試?呢麼什於等會數參的好置設經已中數函麼那,來進傳數參有沒果如,說是就也?呢樣怎會了生發的真況情種這當是可,的許允被不是說理按這。來進遞傳數參有沒偏偏卻,候時的數函用調在是可。a是就那,的數參個一寫填求要是明明數函nuf為因,子例的怪古常非個一是這“
。denifednu:示顯果結
”。樣這於當相就,域用作數函於屬也然自數參個這麼那,a數參個一有中數函的才剛。分細次再子例個這把以可,事回麼怎是底到參傳數函於對,實其。denifednu是就果結,錯沒“
”。況情的數參個一傳隻果如下一看,子例的始開剛到回再。denifednu是還然自量變備預麼那,參傳有沒果如。程過的值賦量變備預給是於當相就程過的參傳。81數參個一遞傳,數函nuf用調我如比,況情的常正說說來下接。量變備預種一為解理被以可數參的數函些這。denifednu是經曾都它,麼什是值的終最其管不量變何任,說者或。denifednu是都段階譯編在其,前之值的正真予賦被在量變何任,說麼這以可。denifednu是就量變部局個這以所,值賦量變個這給有沒並們我為因。量變個一了義定行一第的麵裡即,方地的來起擴號括花是就也,體數函在是成看地單簡以可數參的數函,塗糊犯不方地的鍵關在,解理便方了為“
”。的義意無毫是法做的樣那,中數函個這在碼起最。的義意何任有沒是就麼那,做樣那的真果如,錯沒。算計法無表代,NaN是果結。題問的思意有是真?呢少多是會加相denifednu個2和1字數麼那,denifednu是就值的c和b,1是值的a,下況情種這“
。答回了有就刻立凡小葉,是的到想有沒他令但。思意的休罷不誓倒問凡小葉把不副一有大,題問個一來拋又子弟的麵對”?呢樣怎會又數參個一傳多我果如,吧好“
”。樣這像如比?麼什生發會,數參個一了加它給意故候時的數函nuf用調在我果如,數參有沒但,nuf數函個一了義定我比好。來出解拆獨單以可也實其,題問個這的說你“
{)(nuf noitcnuf
;)01(nuf
”。響影麼什有會不也果結對,數參個四第了加行強你算就,中子例的才剛到回再。啦生發會不都麼什是然自,的知而想可是果結“
。待期份一出露流約隱中神眼,凡小葉向望地色聲動不卻,後題問個這到聽在青元林是可。了人負欺些有是在實題問種這想心,了去下不看都子弟些某的外場連就,勢氣的儘水窮山你到問副一子弟的麵對”?辦咋要需數參的外額問訪麵裡數函在要定一我果如“
”。證驗碼代用以可我。組數stnemugra個一了護維還部內的數函在是但,個三c、b、a了置設數參然雖,數函dda個這如比。麵裡組數的stnemugra作叫個一部內數函到載裝被會都數參的有所實其,的到辦以可是這“
。示所91-1圖如果結行運碼代
果結行運 91-1圖
”。了楚清更得看能就,下一寫改碼代把我在現。的值賦組數個這據根是也c、b、a的麵裡表列數參,說話句換。麵裡組數stnemugra的認默個這了進放都實其,數參個四的來過傳你,到看以可“
。碼代寫始開邊一,考思邊一凡小葉,完說”。了器加累的活靈常非個一是便這,加累現實以可都我,字數少多入傳你管不,說是就也。加累的字數個5行進就,字數個5了入傳;加累的字數個3行進就,字數個3了入傳候時的數函dda用調在我說方比就,些一單簡得說。加累的字數現實,意任數個數參,數函個一寫編以可我如比,能功的趣有些一成完以可,性特個這據根,嗯“
”。了數參何任置設不就脆乾以所,來進傳數參個幾有會道知不並我前之現實在為因“
{)(dda noitcnuf
”。0回返就麼那,在存不素元的置位個一第果如。素元的置位個一第取獲組數stnemugra用先,麼那。來進傳數參個一有會碼起最候時的數函dda用調在設假先我,樣這“
”。樣這像就,來起加累據數的有所將後然,了以可就環循組數的單簡個一做要需隻就我,話的樣這。數個的數參入傳來未知預性屬htgnel的組數stnemugra過通以可卻中體數函的數函在是但,來進傳數參個少多有會道知不我然雖,來看樣這。數個的素元部內組數stnemugra是就的放麵裡性屬個這,性屬htgnel有會就麼那,組數個一是然既stnemugra,是但。的知未是度長的組數stnemugra以所,數參個少多有會竟究道知不為因,來下接“
”。樣這如比,上量變mus到加累部全再,mus量變部局個一義定內數函在以可也我,然當。和的素元有所中組數了到得就,上素元個一第到加累部全素元的有所後往將,始開素元個二第的組數從是路思的法寫種這“
。的期預合符是,0是然依mus是果結的數函。的去不進都次一連環循rof,說是就也,0是就htgnel的組數stnemugra麼那,在存不素元個一第果如為因。了始開方地的0為標下從以可就環循的組數,話的樣這
”。樣這如比,回返據數個一某的中數函將,字鍵關nruter用使是就法方?呢點一這現實以可才麼怎,麼那。的要必有常非是去出露暴mus量變部局將,此因。值的後之加累取獲是就然自的目的數函個這用調麵外麼那,數函加累個一是這然既是可,的量變mus的麵裡域用作數函問訪法辦有沒是麵外,係關的域用作據根。部內的數函在是隻竟畢量變mus是但,和總的數參有所是然雖量變mus,子例的前之比好就。值回返的數函下一說後最“
”。樣這如比。了據數的部內數函取獲以可就域用作局全的麵外,量變mus了成變果結用調的數函,說是就也,mus個一了回返就數函,後之數函用調在麼那,去出)回返(nruter量變mus把“
;)3,2,1(dda = mus rav
;)mus(gol.elosnoc
。了刺出不挑也再子弟的麵對,同認示表,頭點了點也青元林連就,述講的凡小葉完聽”。關重三第之關重七數函是便這“
)包閉(四之關重七數函 22.1
。道說地悠悠凡小葉”。包閉——關重四第的關重七數函是就來下接“
”!包閉得懂也然竟,凡小葉區區他?嗎能技的握掌以可才者行修的別級師大有隻中說傳是不那“,驚大子弟外場”!包閉?麼什“
。涵內的包閉解理力能有子弟的門入剛剛個一信相人有沒本根,的名了出是中tpircSavaJ在度難其,解理以難和澀晦常異術技的包閉,然誠
。啊導指自親的物怪老的別級個那老葉到得能都人有所是不並為因。的別特啥沒也他其,點了特奇、點了煩麻是就也過不包閉,裡知認的他在,景場的候時包閉己自導教老葉起憶回中海腦在是隻,靜動的人圍周意在太有沒並他,凡小葉於至。訝驚是滿,目注凡小葉對紛紛也琪曾尹和青元林連就,子弟外場是隻不。來起定淡不也竟後字二”包閉“到聽在丹羅的賽比看觀地穩沉向一”。包閉道知也然竟,能何德何他凡小葉?能可麼怎這。解了有略毛皮的包閉對才也,籍秘法功的到不得本根子弟他其了得獲,持扶後背在力勢族家有又,年多研鑽心苦我,能可不絕這,能可不。會都包閉連然竟凡小葉這!包閉?麼什“
。音傳的老葉自來到聽凡小葉,時這在就
”!啊聲名的老葉我了沒埋要不可,現表好好,娃娃小,哈哈“
。道證保脯胸著拍凡小葉”!傅師,吧心放“
ł”。值回返數函的到講後最下一提先是還,包閉到說“
”。樣這如比,啊去出回返也數函個一把以可就也然自麼那,去出回返量變個一把以可我果如,中數函在是然既,了好。量變mus問訪以可才麵外,去出回返值回返為作mus把非除,的量變部局個這問訪接直法辦有沒是麵外,量變部局叫也此因,量變的麵裡域用作數函是mus為因“
”。的確正是然依它但,怪奇點有然雖法寫種這。數函的名匿個一是就數函個這的麵裡麼那,了字名取它給不就脆乾以所,字名啥叫數函部內個這乎在不並而,去出回返數函個一把要想是隻我為因,數函個一外另了套嵌麵裡數函個一在是就,中子例個這在“
。道問眉蹙禁不人有”?麼什乾情事的怪奇麼這做你“
”。樣這如比,了量變的中域用作數函麵外問訪以可就域用作數函的麵裡以所,套嵌以可域用作數函為因,義意有然當“
”。樣這要須必就,體數函的數函部內行執要需果如以所,碼代的麵裡行執會不就話的用調去不,數函是然既,數函個一是果結的回返數函tset為因。了點重是就來下接。的樣一是域用作局全問訪以可域用作數函和就理道個這。到問訪它被以可a量變的麵外,說話句換。域用作的部外問訪限權有就部內的數函名匿個這,域用作數函tset於屬也數函的回返終最而,域用作數函的數函tset於屬就a量變個這,a量變部局個一了義定麵裡數函tset“
;)()(tset
”。數函部內個那用調會才號括圓個二第而,數函部內個一回返是就果結的用調次一第,此因。數函部內個一了回返還,a量變部局個一了義定中數函tset個這,數函tset用調是號括小個一第“
。0是果結行執碼代
”。了去出nruter值回返為作數函部內把數函部外,點三第。了用使數函部內被且並,a量變部局個一有麵裡數函tset,子例個這是還。量變部局的數函部外了到用麵裡數函的部內數函,點二第。數函個一有還麵裡數函tset在,子例個這比好就。數函個一有也部內數函在,點一第。件條的包閉生產下一結總我在現,包閉的型典個一是就子例的才剛“
。道問人有”?呢處好麼什有樣這那“
”。的似量變的麵裡域用作局全個一是像好就,在存直一a量變個這現發會就,數函部內個這用調複反我如比。在存續繼是而,毀銷而毀銷的數函原著隨不量變部局個這讓會就麼那,包閉了用使你果如,是但。因原的量變部局數函問訪法無麵裡域用作局全在們我是也這,毀銷後束結用調數函在會量變部局的麵裡其,數函個一用調們我,下況情常正。的有是然自,話的處好說要“
。0是都果結行運碼代
。道問人有”?呢量變個一同是的來出印打明證麼怎你,0是就來本a量變“
”。上加值的數參個這把都候時的數函部內用調次每在,數參的加累個一置設數函部內給以可我,辦好這“
。3、2、1為別分果結行執碼代
”。包閉用使慮考先優要是還,下況情種這在此因。了糟團一得變就碼代,多過量變局全致導會則,量變局全個一義定而能功的一單個某了為果如,域區共公塊一是域用作局全。量變局全的要必不多很少減以可作操包閉用利是就也,作操式形的樣這用是但。量變局全作操中數函在後然,a量變個一了義定麵裡域用作局全在於當相就法寫種這。了a量變個一同是都的問訪麵裡,候時的數函部內用調次每在明證以可就樣這“
。道問人有”?嗎除抹被以可還量變種這麼那,量變部局的中數函部外問訪以可麵裡包閉在說才剛你“
”。量變的用無些這除清動自會就到找旦一,量變的llun為值中數函描掃動自會tpircSavaJ。了行就llun為值賦量變個那將動手刻時的定特個一某在你要隻,以可然當“
。氣口一了籲長凡小葉”。關重四第的關重七數函是便這,了好“
”!密秘有定一,凡小葉個這“:道聲低,頭拳了緊握自暗是更,述論的凡小葉完聽丹羅,靜寂場全
)數函行執自(五之關重七數函 32.1
”。的子樣這是式格的數函行執自。了數函行執自用使慮考以可就,下況情種這在麼那。字名麼什叫數函個這謂所無卻,數函個一行執想隻們我,候時多很。了數函行執自是便,關重五第的關重七數函“
;)()數函的字名有沒個一義定( :法語
”。數函行執自個一義定何如看看,子例的體具個一舉來下接“
”。次一行執被會隻它是但,行執刻立被會然雖它以所,字名有沒數函行執自為因正也。的字名有沒是般一它,數函的行執刻立就後之義定在是就,義思名顧,數函行執自謂所,了數函行執自的單簡個一是便這“
”。子例的前之如比,用使合配包閉和以可般一數函行執自“
”。碼代下一寫改樣這以可我,如比!呢擇選的錯不當相個一是這,數函部內取獲接直數函行執自個一用使就妨不,況情的樣這像麼那。的謂所無,ccc、bbb、aaa叫以可也,tset叫以可它,字名麼什叫數函個這麵外道知要需很是不並我,是思意的我,數函tset意在很是不並我以所,因原個這為因。數函部內的麵裡數函tset是的到得要想正真我實其,中子例的包閉個這在“
”!字名個一取數函部外給要必有沒本根以所,此如為因正,數函的義定時臨而境環包閉生產了為是隻數函部外,了數函部內的下境環包閉到得接直以可就我,來一樣這“
”。了完解講就數函行執自——關重五第的關重七數函“
)數函個一”wen“(六之關重七數函 42.1
。碼代段一了出打就手隨凡小葉,著說”。吧子例個一舉先?呢麼什是用作的它,的字鍵關wen有是中tpircSavaJ在。數函個一”wen“——關重六第的關重七數函是來下接“
”。誰是就siht麼那,的用調誰是數函個這,說話句換,者用調的數函向指siht,是息信個二第。中數函在現出定一就,現出旦一,現出不麼要siht,是息信個一第的出露透話句這,先首?呢話句這解理麼怎,律鐵條一的siht於關是話句這。者用調的數函前當向指遠永siht,單簡很實其?呢思意麼什是它,字鍵關個一的中tpircSavaJ是也siht。象對siht出印打後然,句語印打個一是,話句一就麵裡,olleh數函個一義定便隨我“
。問發人有”?點單簡講能不能,了暈快都我的說你“
”。樣這如比,式方的點是種一第。性屬的麵裡它用調式方種兩過通以可象對而。數函olleh的象對wodniw是也數函olleh,說是就也。的象對wodniw於屬是都實其,數函個一是還量變個一是管不,西東何任的義定麵裡域用作局全在,域用作數函和域用作局全為分麵裡tpircSavaJ,過說麵前“
;)(olleh.wodniw
。碼代段一了出打就手隨凡小葉,著說”。的以可是都寫樣那者或寫樣這我如比,量變個一是以可也,串符字個一是以可稱名性屬,]稱名性屬[象對即,號括中用使是式方種二第“
。碼代段一了出打就手隨凡小葉,著說”?呢麼什生發會麼那,wen了用使候時的數函用調在我果如,上題問的字鍵關wen到回再,了好。wodniw是就的來出印打後用調數函olleh,此因。象對wodniw了向指就然自siht的麵裡數函olleh,此如然既。數函olleh個這了用調象對wodniw是就也實其,數函olleh用調們我,麼那。者用調的數函前當向指遠永siht,了說才剛我“
。碼代了行執功運凡小葉,著說”。吧果結行執下一看先“
果結行運 02-1圖
”。象對的新個這了回返認默數函後然,象對個這了向指siht且並,象對的新個一了生產部內數函是就,些單簡得說。象對個那的向指字鍵關siht——者用調實真的數函olleh是就也,象對的新個一了生產部內數函olleh是果結“。示所02-1圖如果效
”。了象對個那的生產新部內數函是就也,siht的麵裡數函是就tcejbOwen,是就果結的樣這“
”。板模象對個一建構數函造構過通以可我,式方種這過通。數函造構作叫,稱別個一有還數函種這“
。問發人有”?板模象對“
。碼代段一了出打就手隨凡小葉,著說”。性屬些這計設字鍵關siht用中數函在以可就我麼那,性屬等色顏、道味、字名有物食,如比。點特同共些一的物食述描板模象對個一計設以可就我麼那,物食是都們它,物食些這栗板、蕉香、果蘋如比,些單簡得說。類種的象對種一計設式形的數函個一用指是就,板模象對謂所。呼稱的有獨它對我是這,板模象對,的是“
。來過了正糾刻立,尬尷點有後誤口凡小葉”。的來出悟領己自我是,不哦……老葉是這。寫大要需就母字首麼那,數函造構個一是這果如,說來般一,tiurF數函個一了義定我才方“
”。著看,好。的定決己自我由是象對果水的樣麼什個一生產要底到,說話句換。去進傳數參為作性屬些這把就脆乾我以所,的數參遞傳以可是然自,數函是然既,數函個一是就來本tiurF?呢值賦性屬色顏和性屬味氣、性屬字名的象對果水給麵裡數函造構個這在不麼什為我,麼那。象對果水種多很生產會就字鍵關wen合配來將,數函造構果水個一是的計設我,中子例個這在。啦性屬置設象對個那的成生將即來未給麵裡數函在接直以可就我,由緣個一的樣這於基。象對個這了向指就siht而,來出象對個一生產新部內從會後以字鍵關wen了用使在數函為因“
。示所12-1圖如果效!字鍵關wen了用使且並,數函用調始開就,手揮一凡小葉見隻
;)'色紅','口可甜香','果蘋大'(tiurF wen = elppa rav
果結行運 12-1圖
。口爽很還,酸不,甜別特,腔口著盈充液汁的甜香時頓,口一了咬力用凡小葉著接,裡手的凡小葉了在現出就果蘋大的彤彤紅個一,間瞬一
。沫唾口一了吞自暗是隻,果蘋紅大著吃凡小葉著看子弟的麵對。聲一了嗽咳力用便,尬尷些有覺感也麵場個這見看青元林,片一聲噓子弟外場。試考在還己自了忘至甚,了完吃果蘋把就二除五下三,來下不停本根,兒味有越啃越凡小葉”?吃好麼這,咦“
。頭撓了撓地思意好不便凡小葉,賽比在還己自到識意是約大
。碼代出打凡小葉”。來出象對義定自個一作製接直以可也,象對個一建創數函用了除“
”。象對個一外另者或數函是至甚,串符字是以可也,字數是以可它,串符字是能隻是不並值。用不以可也,號引用以可鍵。值的性屬是就值,稱名的性屬是就鍵。值是的邊右,鍵是的邊左,對值鍵。隔分號逗用能隻對值鍵的同不,號冒用中當,式形的對值鍵是都值性屬和性屬的麵裡象對。了象對個一義定接直以可就號括花用使,式方種一的象對建創是這“
。道問地解不人有”?嗎便方更是不象對義定樣這,呢數函造構用使要還麼什為,樣這然既“
”。次兩寫得就式方的號括大用使而。果蘋個兩得獲地便方常非以可,了行就數函wen次兩用調接直,話的數函造構用使,果蘋個2要需我如比。的勢優有是象對義定數函造構用,不“
。碼代段一了出打也,氣服不子弟的麵對”?了好就不寫樣這接直我,吧是不“
。方地的意注要需和妙奧的中其了白明經已己自,導指的老葉過經來後過不?嗎誤錯個這過犯經曾也是不己自,候時的己自導教老葉年當想心,笑好覺暗凡小葉,碼代段一這到看
”。試測個一做來我,話的信相不。的果蘋個一同向指是都實其4elppa和3elppa,話的寫樣這你,不“
”。性屬的掉吃被否是個一加添象對果蘋給,先首“
”。了道知就變改被起一著跟否是3elppa看查,著接。掉吃被經已成改態狀的掉吃被有沒把,性屬tae的4elppa改修,3elppa於等4elppa量變讓後然“
。示所22-1圖如果效
果結行運 22-1圖
。色失驚大子弟的麵對”?啊麼什為是這“
”。樣這如比,製複的值據數是成看以可就,量變個一外另給值賦量變個這將後然,量變個一某給值賦型類據數本基將果如。型類據數用引於屬就象對如比。型類據數用引於屬都他其,外之型類據數本基了除,說來單簡“
;01 = 1a rav
;1a = 2a rav
”。化變的麵上了有才以所。值性屬的象對實真改修以可都們它,說是就也,限權的域區存內塊一這作操有擁都們它,4elppa是還3elppa是管不,來一樣這。址地象對的實真是就也,址地存內塊一同向指卻是但,了量變的同不個兩的區量變於屬都就4elppa和3elppa,中子例的才剛在麼那,區存內和區量變個一出分地單簡果如,同不則型類據數用引而。間空的同不於處卻上存內在是但,01是都然雖,據數的同不是還2a和1a,麼那“
”。了容內部全的關重六第是就這,了好“
)數函調回(七之關重七數函 52.1
”。吧子例個一舉是還我,口繞點有能可說麼這。數函個一另給遞傳數參作當義定的數函個一把指是就,數函調回謂所。數函調回——關重七第是後最“
”。題問的料佐麼什加要、吃麼怎、麼什吃慮考得就我,數函的’飯吃‘是然既,數函的’飯吃‘個一有在現我如比。數參的數函個一另為作以可也數函:是就性特個這,性特的大強種一了供提tpircSavaJ是但。題問有沒都這,串符字個一是以可也,字數個一是以可參傳數函,下況情常正“
”。的子樣個這是能可,候時的數函’飯吃‘個這用調要我當,麼那。去進了傳數參作當都料佐和吃麼怎、物食把我且並,數函’飯吃‘個一是這“
;)'然孜撮一上撒','地嘻嘻笑','串肉羊'(tae
。串肉羊吃地嘻嘻笑,然孜撮一上撒:是果結行運碼代
。碼代出打刻立凡小葉,完說”?嗎了好就不數函的數參為作經已個這用調接直候時的吃麼怎慮考要需正真在,候時到?呢法方tae個這入傳數參個一作當法方的吃把能不能我,麼那。性機隨的大很有則料佐麼什加而,了好慮考先預難很就吃麼怎是但,的好想就先預是能可麼什吃為因,遞傳數參作當以可樣照量變物食,以所?嗎定決才候時的飯吃的真我在該應是不道難吃麼怎底到,為行個這飯吃如比。法想的膽大個一了生產就地然而然自我,以所。的煩麻常非是則,大較比動改果如。體碼代的數函改修至甚,表列數參的數函改修得就我?辦麼怎該又件條的新加添數函個這給要我天某果如是但,的以可是然自做樣這“
。呼驚人眾”!碼代的怪奇好?麼什是這“
。碼代了出打刻立凡小葉,完說”!的現實數函的新個一寫編時臨過通候時的數函tae用調你在是吃麼怎底到,說是就思意。kcabllac了入傳數參doof個一另把且並,kcabllac了行執接直,中數函tae個這在麼那。體數函的數函行執以可就號括個一打道知都們我,數函是然既,數函個那是就kcabllac,先首。來道慢慢我容,急著要不“
”!了物食的吃要是便這,doof數參了計設也候時的數函名匿個這寫編在我,時同。已而行執數函tae入進它望希是就的目的我,了謂所無就然自字名麼什叫它,的寫編時臨是數函個這“
。了服口服心也是但,心甘不然雖子弟的麵對。果結賽比布宣著笑微,身起站青元林”。了勝獲凡小葉是問疑無毫試比場這,錯不得講,嗯“
。場現了開離便,話句這下拋地冷冷丹羅”!密秘有定一凡小葉個這,走“