官术网_书友最值得收藏!

第3章 函數(shù)和數(shù)組

本章主要內容

● 函數(shù)的基本概念

● 內置頂層函數(shù)和數(shù)據(jù)類型轉換

● ES6中新增的函數(shù)語法

● 數(shù)組

在JavaScript 中,函數(shù)是頭等對象,因為在編程過程中,所有的事件操作都是基于函數(shù)的。此外函數(shù)也可以像任何其他對象一樣具有屬性和方法,當然,區(qū)別就在于函數(shù)可以被調用。使用函數(shù)可以使程序更加簡潔、邏輯更加有條理、調用更加方便、維護更加容易等。在使用函數(shù)的過程中,它可以作為最基本的功能函數(shù)存在,也可以作為對象使用,亦可以當作構造函數(shù)使用。

使用函數(shù)是為了幫助編程人員更好地調用代碼,那么在函數(shù)中無非是對一組或一系列數(shù)據(jù)的操作,如頁面中有很多的input 元素,要想操作這些元素,就要把它們全部獲取,如果不借助數(shù)組來操作,那就得分別獲取并操作多次。如果用數(shù)組,那么就可以一次獲取并操作所有的元素。所以數(shù)組的好處就是:可以很方便地對很多數(shù)據(jù)進行重復操作。

3.1 函數(shù)的基本概念

函數(shù)是將完成某一特定功能的代碼集合起來,可以重復使用的代碼塊。通過函數(shù),編程人員可以封裝任意多條語句,且可以在任何地方、任何時間進行調用。

示例:

說明:在上述示例中,通過函數(shù)實現(xiàn)了對上一章中金字塔的封裝。直接調用這個函數(shù)并且傳入想要輸出的行數(shù)即可,而不需要再重復地將該功能寫一遍。

3.1.1 函數(shù)的聲明

函數(shù)的聲明有3種形式:通過function 關鍵字聲明,通過字面量(匿名函數(shù))的方式聲明,通過實例化構造函數(shù)聲明。

第1種:通過function關鍵字聲明,語法如下:

通過function關鍵字聲明的函數(shù)類似通過var聲明的變量一樣,會被解析器有限讀取。

示例:

說明:在上述示例中,max函數(shù)定義如下。

1)function指出了這是一個函數(shù)定義。

2)max是這個函數(shù)的名稱。

3)(x,y)括號中是函數(shù)的參數(shù),參數(shù)個數(shù)沒有限制,當有多個參數(shù)時以逗號分隔。

4){}之間的是函數(shù)體,可以有若干條語句。

需要特別注意一下,函數(shù)體內部的語句在執(zhí)行時,一旦執(zhí)行至return時,函數(shù)就會執(zhí)行完畢,且返回一個值。如果沒有return 語句,則會默認返回undefined。因此,如果想要返回一個特定的值,則函數(shù)中必須有return語句來指定要返回的值。返回的值還可以進行其他操作。

5)需要特別注意,一個函數(shù)只有一個返回值,如果需要同時返回多個值,則一定要將多個值放進一個數(shù)組里,以數(shù)組元素的形式返回。有關數(shù)組的更多詳情可參考第5章。

第2種:通過字面量的方式聲明(函數(shù)沒有名字),語法如下:

通過字面量聲明的函數(shù)是一個匿名函數(shù),即將函數(shù)存儲在變量中,而不需要函數(shù)名稱,調用的時候通過變量名來調用。這種形式通常見于事件處理程序或者回調函數(shù)中。

與通過function 關鍵字進行聲明的不同之處在于,函數(shù)表達式必須等到解析器執(zhí)行到它所在的代碼行時才會被解釋執(zhí)行。

第3種:通過實例化構造函數(shù)的方式聲明,語法如下:

函數(shù)也是對象,可以通過實例化構造函數(shù)來得到。當使用new關鍵字創(chuàng)建一個對象時,即調用了構造函數(shù)。一般不推薦大家使用這種方法定義函數(shù)。

示例:

說明:通過實例化構造函數(shù)來聲明函數(shù)時,需要注意參數(shù)必須加引號。

3.1.2 函數(shù)的調用

1)用()來調用(用于聲明函數(shù)的調用)。

在調用時,可以按順序傳入?yún)?shù)。有關函數(shù)參數(shù)后文會有詳細介紹。

示例:

2)自調用(用于匿名函數(shù)的調用,匿名函數(shù)還可以通過引用變量來調用)。

示例:

3)通過事件調用。

HTML部分:

CSS部分:

JavaScript部分:

運行結果如圖3-1所示。

圖3-1

下面總結一下創(chuàng)建及調用函數(shù)時需注意的問題。

如果兩個函數(shù)的命名相同,則后面的函數(shù)將會覆蓋前面的函數(shù)。

示例:

以基本語法聲明的函數(shù),會在頁面載入時提前解析到內存中,以便調用,所以可以在函數(shù)的前面調用。但是以字面量形式命名的函數(shù),在執(zhí)行到它的時候,才進行賦值,所以只能在函數(shù)的后面調用。請看如下3個示例。

示例1:

示例2:

示例3:

在不同的script 塊中,因為瀏覽器解析時是分塊解析的,所以前面的script 塊不能調用后面script塊內的函數(shù),所以在不同的script塊之間調用函數(shù)時,應該先定義后調用。

示例:

3.1.3 參數(shù)

在使用函數(shù)時,若想通過傳遞一些不同的值就能得到不同的結果,此時就需要用到參數(shù)。參數(shù)分為形參和實參兩種,形參是在定義函數(shù)時設置的一個變量,實參是在調用函數(shù)時傳遞的具體的值。

示例:

參數(shù)的數(shù)據(jù)類型可以為任意類型的值,示例如下:

參數(shù)的個數(shù)可以有很多個,示例如下:

當實參和形參個數(shù)不統(tǒng)一時:

1)如果形參的個數(shù)大于實參的個數(shù),那么多余的形參會被賦值為undefined。

2)如果實參的個數(shù)大于形參的個數(shù),則對函數(shù)沒有影響。可以通過arguments對象訪問實參,示例如下。

arguments 對象是函數(shù)中自帶的一個對象,用于保存所有的實參信息,其形式是一個類似數(shù)組的形式,擁有以下屬性。

1)arguments.length:返回函數(shù)實參的個數(shù)。

2)[index]:通過“[index]”的形式可以訪問對象中的任意一個元素,index 被稱為下標,從0開始計數(shù)。

3)arguments.callee:返回當前執(zhí)行的函數(shù)整體。

arguments對象是函數(shù)創(chuàng)建時才有的,不能顯式創(chuàng)建。

在JavaScript 中,因為arguments 對象的存在,可以不明確指出參數(shù)名就進行訪問,示例如下:

其實在JavaScript 中并沒有函數(shù)重載的功能,但是arguments 對象能夠模擬函數(shù)重載,示例如下:

說明:在上述示例中簡單實現(xiàn)了類似于計算器的功能,當傳入一個參數(shù)時,進行一個累加的運算;當傳入?yún)?shù)多于一個時進行求和運算。這里就不給出具體代碼了,但有一點需要注意,當if分支越來越多的時候,這種實現(xiàn)方法很不友好,讀者可以想想這里該如何進行優(yōu)化。

arguments 對象的callee 屬性返回的是當前執(zhí)行函數(shù)本身,故可以實現(xiàn)遞歸函數(shù)(目前只是介紹arguments對象的用法,有關遞歸函數(shù)詳見3.1.7節(jié)),示例如下:

3.1.4 函數(shù)的返回值

函數(shù)的返回值就是函數(shù)運行結束之后得到的結果。

示例:

說明:上述示例中,停止并跳出當前函數(shù),即不會執(zhí)行return后面的語句。

示例:

說明:上述示例中,一個函數(shù)可以有多個return 語句,但只有一個return 語句執(zhí)行(用于判斷)。

可以給一個函數(shù)返回值:

1)返回值可以是任何數(shù)據(jù)類型。

2)如果一個函數(shù)沒有返回值,則會自動賦值為undefined。

示例:

一個函數(shù)只能有一個返回值,示例如下:

原因:用逗號作為返回值時,是按從左到右的順序進行賦值的,最終賦值為最后一個值,前面的值被覆蓋了。前文已經(jīng)提到過,若想返回多個值,需要借助數(shù)組。

3.1.5 作用域

在JavaScript 中,無論是變量還是函數(shù),實際上訪問都是有權限的。而JavaScript 的執(zhí)行環(huán)境決定了變量或函數(shù)是否有權訪問其他數(shù)據(jù)。JavaScript有自己的生存環(huán)境。

1. 環(huán)境

在JavaScript中環(huán)境分為兩類:

(1)宿主環(huán)境

宿主環(huán)境指的就是瀏覽器。

(2)執(zhí)行環(huán)境(執(zhí)行環(huán)境決定了變量和函數(shù)的訪問權限)

1)全局環(huán)境:整個頁面。

2)函數(shù)環(huán)境:一個函數(shù)就是一個環(huán)境。

3)eval():用來計算 JavaScript 字符串,并把它作為腳本代碼來執(zhí)行。如果傳入的參數(shù)不是字符串,則直接返回這個函數(shù)。如果參數(shù)是字符串,則會把字符串當成JavaScript 代碼進行編譯,如果編譯失敗,則拋出一個語法錯誤異常。如果編譯成功,則開始執(zhí)行這一段代碼,并返回字符串中的最后一個表達式或語句的值。如果最后一個表達式或語句沒有值,則最終返回undefined。如果字符串拋出一個異常,則這個異常將把該調用傳遞給eval()。

示例:

注意:代碼必須在一行里書寫。

2. 作用域

函數(shù)對象擁有可以通過代碼訪問的屬性和一系列僅供 JavaScript 引擎訪問的內部屬性。作用域是其中的一個內部屬性,可以限制一段代碼的作用范圍。

作用域有以下兩種情況:

(1)全局變量

在函數(shù)外部聲明的變量,或者沒有使用var 關鍵字聲明的變量,在任何地方都可以訪問到,擁有全局的作用域。

(2)局部變量

在函數(shù)內部聲明的變量,參數(shù)也是局部變量。只能在函數(shù)內部訪問到,函數(shù)之外的任何地方都訪問不到。

3. 全局作用域

以下兩種情形擁有全局作用域:

1)在最外層函數(shù)外定義的變量和最外層函數(shù)擁有全局作用域。

2)所有未通過關鍵字定義就直接賦值的變量自動聲明擁有全局的作用域。

示例:

說明:在上述示例中,在foo函數(shù)內部聲明的變量b只擁有局部作用域,在foo函數(shù)外面是訪問不到的。

4. 作用域鏈

在JavaScript中,一切皆對象(有關對象詳見第4章),函數(shù)也是對象,和其他的對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供 JavaScript 引擎訪問的內部屬性。其中的一個內部屬性 Scope,包含了函數(shù)被創(chuàng)建的作用域中對象的集合,稱為函數(shù)的作用域鏈。作用域鏈決定了哪些數(shù)據(jù)能被函數(shù)訪問。當一個函數(shù)創(chuàng)建后,其作用域鏈會填充此函數(shù)的作用域中可訪問的數(shù)據(jù)對象。

示例:

說明:在上述示例中,bar函數(shù)被包含在foo函數(shù)內部,這時foo內部的局部變量對bar是可見的,故返回來的num值為2,而bar函數(shù)內部的局部變量對foo就是不可見的;col函數(shù)被包含在bar 函數(shù)內部,col 內部聲明的變量沒有通過關鍵字聲明,是個全局變量,故在bar函數(shù)中得到的num值為4;這就是JavaScript中的“鏈式作用域”。因此,父對象的所有變量對子對象都是可見的,反之亦然。

5. 預解析順序

1)按<script></script>塊來解析。

2)按環(huán)境來解析。

3)遇到關鍵字var 和function時,提前解析到內存中。

示例:

4)如果還有<script></script>塊,則再按上述順序來解析。

3.1.6 回調函數(shù)

在編程過程中,很多時候需要編程人員自己去定義一個函數(shù),但是有時只需要寫函數(shù)的一部分,然后作為另外一個函數(shù)的參數(shù)來使用,如arry.forEach,這樣的函數(shù)稱為回調函數(shù)。

1)通過函數(shù)指針來調用(直接寫函數(shù)名),示例如下:

2)把函數(shù)整體作為參數(shù)傳進去,示例如下:

3.1.7 遞歸函數(shù)

遞歸函數(shù)就是在函數(shù)內部直接或間接引用自身。

使用遞歸函數(shù)時一定要注意,如果處理邏輯不當就會造成無限遞歸,從而引起堆棧溢出,故每個遞歸函數(shù)里必須有終止條件。

示例:

說明:上述示例實現(xiàn)了階乘,先尋找遞歸的關系,即c 與c-1,c-2,…,1 之間的關系,找到關系以后就可以將遞歸函數(shù)的結構換成遞歸體。

示例:

運行結果最終將json的數(shù)據(jù)格式轉化為數(shù)組,如圖3-2所示。

圖3-2

3.1.8 閉包函數(shù)

JavaScript 允許函數(shù)嵌套,并且內部函數(shù)可以訪問定義在外部函數(shù)中的所有變量和函數(shù),以及外部函數(shù)能訪問的所有變量和函數(shù)。但是,外部函數(shù)不能訪問定義在內部函數(shù)中的變量和函數(shù)。這給內部函數(shù)的變量提供了一定的安全性。而且,當內部函數(shù)生存周期大于外部函數(shù)時,由于內部函數(shù)可以訪問外部函數(shù)的作用域,定義在外部函數(shù)的變量和函數(shù)的生存周期就會大于外部函數(shù)本身。當內部函數(shù)以某一種方式被任何一個外部函數(shù)作用域訪問時,一個閉包就產(chǎn)生了。

簡單地說,函數(shù)對象可以通過作用域鏈相互關聯(lián)起來,函數(shù)體內部的變量都可以保存在函數(shù)作用域內,這種特性稱為閉包。

示例:

閉包的用途:

1)讀取函數(shù)內部變量,如上述示例。

2)可以使變量一直保存在內存中,示例如下。

上文說到閉包可以使變量一直保存在內存中,但內存消耗大,故不能濫用閉包,以免造成內存泄漏。解決辦法是,在退出函數(shù)之前,刪除不使用的局部變量。

通過以上對閉包的了解,可以發(fā)現(xiàn)閉包共有3個特性:

1)函數(shù)嵌套函數(shù)。

2)函數(shù)內部可以引用外部的參數(shù)和變量。

3)參數(shù)和變量不會被垃圾回收機制回收。

有關閉包的使用在后續(xù)章節(jié)中會有體現(xiàn),讀者可以留心查看。

3.2 內置頂層函數(shù)和數(shù)據(jù)類型轉換

3.2.1 內置頂層函數(shù)

內置頂層函數(shù)就是ECMAScript 自帶的函數(shù),讀者不用知道它是怎么實現(xiàn)的,只要會用就行了。它可以作用于任何對象,在整個頁面中調用時都有效。

1)escape();——對字符串進行編碼。

2)unescape(str);——對編碼的字符串進行解碼。

3)Number();——將任何數(shù)據(jù)類型轉換為數(shù)值類型。

① 如果是布爾值,true為1,false為0。

② 如果是數(shù)值,轉換為本身,會將無意義的后導零與前導零去掉。

③ 如果為null,則轉換為0。

④ 如果是undefined,則轉換為NaN not a number。

⑤ 如果字符串中只有數(shù)字,則轉換為數(shù)字(十進制)時會忽略前導零和后導零。

⑥ 如果是規(guī)范的浮點數(shù),則轉換為浮點數(shù)時會忽略前導零和后導零。

⑦ 如果是空字符串,則轉換為0。

⑧ 如果是其他值,則轉換為NaN。

4)parseInt();——將任何數(shù)據(jù)類型轉換為整數(shù)。

① 如果一個字符串中只包含數(shù)字,則轉換為十進制數(shù)。

② 如果有多個空格,則會先找到第一個非空的值進行轉換,直到?jīng)]有數(shù)值時結束。

③ 如果第一個值不是以數(shù)字或空格開頭的,則一定轉換為NaN。

④ 有兩個參數(shù)時,第一個參數(shù)表示要轉換的值,第二個參數(shù)表示幾進制,返回值是一個十進制的數(shù)字。

注意:第一個參數(shù)從最高位開始計算,只要有一位數(shù)可以識別為第二個參數(shù)傳入的進制,則可以實現(xiàn)轉化;第二個參數(shù)是一個2~36之間的整數(shù),通常默認為10。

5)parseFloat();——將任何數(shù)據(jù)類型轉換為浮點數(shù)并返回。

如果傳入的參數(shù)有多個小數(shù)點,則只返回當前已經(jīng)解析到的浮點數(shù)。

如果字符串是一個有效的整數(shù),則其返回的是整數(shù),不會返回浮點數(shù)。

6)String();——將任何數(shù)據(jù)類型轉換為字符串。

① 如果是null和undefined,則轉換為字符串"null"和"undefined"。

② 如果是數(shù)值類型,則轉換為本身的字符串,123轉換為"123"。

③ 如果是布爾類型,則true為"true",false為"false"。

7)Boolean();——把任何數(shù)據(jù)類型轉換為布爾型。

轉換為假的有""(空串),null,undefined,0,false,NaN;其他都為真。

8)isNaN();——判斷一個數(shù)據(jù)能否轉換為數(shù)值。如果能轉換成數(shù)值則返回假,不能則返回為真。

3.2.2 數(shù)據(jù)類型轉換

前文中已介紹JavaScript具有松散型特點,又稱為弱類型語言,這就意味著在JavaScript中,變量可以隨時賦予任意數(shù)據(jù)類型的值。

示例:

說明:在這個三元表達式中,變量x 到底是什么類型的數(shù)據(jù),取決于變量y。只有當代碼運行時,我們才能知道變量x的數(shù)據(jù)類型。

再如,對字符串類型的兩個數(shù)值進行計算“var x = "10"-"4";”,在執(zhí)行過程中兩個字符串相減依然得到一個number類型的值。這是因為JavaScript在執(zhí)行過程中自動為它們進行了數(shù)據(jù)類型的轉換。

下面重點介紹JavaScript中的數(shù)據(jù)類型轉換,主要分為兩大類。

1. 強制類型轉換

1)Number()——轉換成數(shù)字。

2)String()——轉換成字符串類型。

3)Boolean()——轉換成布爾類型。

4)parseInt()——將字符串轉換為整型。

5)parseFloat()——轉換為浮點型。

可以結合參考3.2.1節(jié)。

2. 隱式類型轉換

隱式類型轉換是JavaScript自動完成的。一般發(fā)生隱式轉換有以下幾種情況:

1)不同類型的數(shù)據(jù)進行運算。

經(jīng)常用于算數(shù)運算符類(+、-、*、/、%)。如果操作數(shù)不是數(shù)值,則將隱式地調用函數(shù)Number(),按照這個函數(shù)的轉換規(guī)則進行轉換。如果轉換不成功,則整個表達式返回NaN。

對于加號(+)運算符需要特別注意:

① 任何數(shù)據(jù)類型和字符串相加,得到的是它們拼接的結果。

② 如果操作數(shù)都是布爾值,那么進行Number()轉換,false為0,true為1,再進行相加。

2)關系運算符類。

關系運算符的操作數(shù)可以是任何類型,如果操作數(shù)不是數(shù)值類型,則將發(fā)生隱式的轉換。

3)邏輯運算符類。

參考2.3節(jié)。

4)語句(即對非布爾值類型的數(shù)據(jù)求布爾值)。

if 語句、while 語句和三元表達式中的表達式會隱式調用函數(shù)Boolean(),按照這個函數(shù)的轉換規(guī)則,轉換為相應的布爾值。

3.3 ES6中新增的函數(shù)語法

3.3.1 函數(shù)參數(shù)的默認值

ES6允許為函數(shù)的參數(shù)設置默認值,即直接寫在參數(shù)定義的后面。

示例:

最好將帶默認值的參數(shù)放在最后,這樣使用起來會很方便,如下面示例。

示例1:

示例2:

3.3.2 函數(shù)的name屬性

函數(shù)的name屬性就是返回該函數(shù)的函數(shù)名,ES6中寫入了標準,示例如下:

3.3.3 箭頭函數(shù)

下面介紹箭頭函數(shù)的基本用法。

ES6允許使用“箭頭”(=>)定義函數(shù)。

上面的箭頭函數(shù)等同于:

如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù),則使用一個圓括號代表參數(shù)部分:

如果箭頭函數(shù)的代碼塊部分多于一條語句,則需要使用大括號將它們括起來:

由于大括號被解釋為代碼塊,因此如果箭頭函數(shù)直接返回一個json,則必須在對象外面加上括號:

箭頭函數(shù)可以與變量結構結合使用,示例如下:

箭頭函數(shù)使得表達更加簡潔,示例如下:

3.4 數(shù)組

在編程中,開發(fā)人員經(jīng)常需要存儲一組相關聯(lián)的數(shù)據(jù)并對它們進行不同的操作,如想要從全國的小黃車中找出某一輛,或者幾百輛,這并不是一件容易的事,此時數(shù)組是最好的幫手。數(shù)組一般用來存儲一組相同類型的數(shù)據(jù),當然也可以存儲不同類型的數(shù)據(jù)。通過下標的方式可以訪問其中的任何一個值。此外,在數(shù)組中,每個元素還有唯一的ID,這樣更方便統(tǒng)一管理和使用。

3.4.1 數(shù)組的概念

數(shù)組就是一個可以存儲一組或是一系列相關數(shù)據(jù)的容器。通過數(shù)組可以幫助開發(fā)人員解決大量數(shù)據(jù)的存儲與使用問題。

3.4.2 數(shù)組的創(chuàng)建

JavaScript 中的數(shù)組和其他語言中的數(shù)組有著很大的差別,JavaScript 中的數(shù)組元素無須指定數(shù)據(jù)類型,可以是任意數(shù)據(jù)類型的,且大小可以調整。創(chuàng)建數(shù)組的方法有以下兩種:

1. 通過對象創(chuàng)建(實例化)

語法如下:

(1)直接賦值

示例:

說明:可以在創(chuàng)建數(shù)組的同時直接進行賦值,即在數(shù)組內指定元素值。

(2)聲明以后再賦值(具有兩種方式)

方式1:可以使用一個整數(shù)自變量來控制數(shù)組的容量。

示例:

說明:當聲明數(shù)組時,括號中傳入的只有一個參數(shù)(new Array(num)),且當參數(shù)類型是數(shù)值類型時,表示的是數(shù)組的長度,即創(chuàng)建了一個包含 num 個元素的數(shù)組,且數(shù)組的值為undefined。之后可以通過下標來初始化數(shù)組中的元素。

方式 2:可以添加任意多個值,就像定義任意多個變量一樣,該賦值方式體現(xiàn)了數(shù)組的長度是可調整的。

示例:

說明:當聲明數(shù)組時,也可以不傳遞參數(shù),通過下標進行數(shù)組元素的初始化。

2. 通過json格式創(chuàng)建(即隱式創(chuàng)建)

語法如下:

(1)直接賦值

示例:

說明:可以在聲明數(shù)組的同時對其進行賦值。

(2)聲明以后再賦值

示例:

說明:可以聲明以后通過下標進行數(shù)組元素的初始化。

之前介紹的都是一維數(shù)組,實際編程中常用的還有二維數(shù)組,二維數(shù)組的本質其實就是數(shù)組中的元素又是數(shù)組,示例如下:

3.4.3 數(shù)組的訪問

在創(chuàng)建數(shù)組時可以直接通過下標進行數(shù)組元素的初始化,那么在訪問或操作數(shù)組時就可以通過下標的方式來訪問,這樣就可以訪問某個特定的元素。

注意:通過下標訪問數(shù)組時,需要注意下標是從0 開始的,0 表示數(shù)組的第一個元素,最后一個元素可以用“arr.length-1”來表示,示例如下:

說明:如上述示例,通過下標訪問數(shù)組時,如果下標的范圍超出數(shù)組定義的范圍,則將返回undefined。

二維數(shù)組的訪問方式如下:

3.4.4 數(shù)組的遍歷

當對數(shù)組進行操作時,遍歷是不可或缺的,遍歷數(shù)組常用的方法有3種。

1.for

在JavaScript中數(shù)組遍歷最簡單的方法就是for,通過for可以指定循環(huán)的初始值與最大值,最大值即數(shù)組的長度。

示例:

說明:i 在遍歷數(shù)組中代表下標,arr[i]代表某個元素。for 循環(huán)的效率雖然不高,但是使用頻率還是比較高的,對于for循環(huán)仍有優(yōu)化的空間,代碼如下:

說明:使用一個變量將數(shù)組長度提前緩存起來,以避免重復獲取數(shù)組長度,這種優(yōu)化在數(shù)組長度較長時優(yōu)化效果會比較明顯。

二維數(shù)組的遍歷如下:

2.for in

相比較for循環(huán),for in也比較受歡迎,但是在眾多的循環(huán)遍歷方式中,它的效率比較低。

示例:

3.forEach

forEach 是數(shù)組自帶的一種比較簡便的遍歷方式,性能要比for 循環(huán)弱。而且在IE 中不兼容,需要做處理。

示例:

說明:在forEach方法中傳入了3個參數(shù),item代表當前的元素,index代表當前元素的下標,arr代表原始數(shù)組。

forEach在IE6~IE8下的兼容處理:

注:有關this詳情參見4.2.3節(jié)。

下面編寫兩個數(shù)組的相關操作示例。

示例1:實現(xiàn)數(shù)組篩選和判斷。

示例2:實現(xiàn)數(shù)組去重。

主站蜘蛛池模板: 杭锦后旗| 安庆市| 北海市| 甘孜| 教育| 九台市| 电白县| 随州市| 蚌埠市| 乌拉特后旗| 京山县| 马鞍山市| 山东省| 海淀区| 宝应县| 深水埗区| 昂仁县| 林甸县| 岗巴县| 延吉市| 玛曲县| 霍林郭勒市| 礼泉县| 临武县| 唐海县| 潍坊市| 邛崃市| 清河县| 宜春市| 麻江县| 石城县| 丹棱县| 延安市| 延长县| 金阳县| 枝江市| 方城县| 新丰县| 邵阳市| 青冈县| 长治县|