您的位置:電腦故障網 > 網絡 > 網絡爬蟲編程 JavaScript函數對象網絡

網絡爬蟲編程 JavaScript函數對象

電腦裝機員小李整理編輯2019-03-27作者:sergiojune【網絡】

JavaScript 也有對象,我們也可以隨時面向對象,方便得很,那怎樣才有對象呢?下面告訴你!

1. 數組

數組,字面意思就是一堆數的組合,但是它是有順序的,學了數組就不僅可以存儲一個數據,還可以存儲一堆數據,這就是我們為什么學了簡單數據類型之后還要學數組的原因。

1.1 聲明數組

網絡爬蟲編程 JavaScript函數對象1

可以看到,數組里面的定義和 python 里的差不多,也可以存儲不同數據類型。獲取數組元素也是一樣通過下標獲取,下標從 0 開始,而且 JavaScript 的數組可以隨意根據下標進行賦值,不管你的數組長度,因為 JavaScript 的數組長度是動態的。

網絡爬蟲編程 JavaScript函數對象2

1.2 遍歷數組

遍歷數組,根據數組長度可以輕易知道循環次數,所以可以使用 for 循環,獲取數組的長度可以通過 length 屬性進行獲取。

網絡爬蟲編程 JavaScript函數對象3

這里有個提高效率的地方,就是在獲取數組的長度時放在了 for 語句的初始化表達式里,而不是放在判斷表達式里,當你這個值需要運算才能獲得的時候,這樣做就可以不用在每次判斷時都需要通過運算獲得,減少運算,也就提高效率了,當然,數組的長度在這里只是一個屬性,不需要運算,放不放在初始化表達式都差不多。

1.3 清空數組

JavaScript 這里清空數組簡單粗暴,直接將長度賦值為 0 即可。

網絡爬蟲編程 JavaScript函數對象4

1.4 數組小練習

  • 找出數組中最大的值

這個直接通過遍歷數組,然后將每個值進行比較即可,很容易。

網絡爬蟲編程 JavaScript函數對象5

  • 翻轉數組

這個就是將數組中的元素前后互相替換,也不多說了。

網絡爬蟲編程 JavaScript函數對象6

2. 函數

當我們需要在對多個數組進行上面的其中練習之一,比如進行尋找最大值,我們總不能每個數組都各自寫一段尋找最大值的代碼,否則這樣子的話代碼的復用性太低了。

函數的出現就是解決這個問題的,函數就是把一段相對獨立的具有特定功能的代碼抽取出來進行封裝,形成一個獨立的個體。當需要多次使用的時候,我們只需要使用函數名調用即可

2.1 函數的定義

函數定義這里有兩種方法,如下:

  • 使用函數聲明,語法為

網絡爬蟲編程 JavaScript函數對象7

網絡爬蟲編程 JavaScript函數對象8

  • 使用函數表達式,語法為:

網絡爬蟲編程 JavaScript函數對象9

網絡爬蟲編程 JavaScript函數對象10

上面只是函數的定義而已,并不會去執行,只有你調用函數的時候才會去執行。

2.2 函數調用

調用函數的語法也比較簡單,就是函數加上一個括號就行了。

網絡爬蟲編程 JavaScript函數對象11

網絡爬蟲編程 JavaScript函數對象12

所以當需要多次使用這段功能的時候,就多次調用即可,不需要每次都寫一段相同的代碼。

2.3 函數參數

不需要多次寫同一段代碼解決了,但是當有不同的數據內容參與運算時,好像我還需要重復寫呀!就比如前面說的求數組最大值。這個時候就需要我們的函數參數了,函數參數就是解決這個不確定的數據內容的。當我們需要對不確定數據內容進行操作時,只需要在調用函數的時候把數據內容當作參數傳進去即可。

函數的參數定義與調用語法:

網絡爬蟲編程 JavaScript函數對象13

  • 形參:在聲明函數時,有些值是固定的,而有些值不是固定的,對于這些不固定的值,我們可以給它們設置參數,但是這個參數不是具體的值,只是一個形式而已,所以叫做形參

  • 實參:在函數聲明設置的形參,我們調用函數就需要傳入對應的參數,而這個參數就是實參。

了解了這個之后,是不是很容易就可以寫出一個求數組最大值的函數了?

網絡爬蟲編程 JavaScript函數對象14

咦?上面的我都看明白了,但是 return 那個語句又是什么?return 后面跟的內容就是函數的返回值,當函數運行到這里的時候就會結束函數并且把該值返回給調用處,就相對于一段代碼執行之后的反饋所以 return 語句也會常常用于終止函數的運行,還有也可以不寫 return 語句,但是會默認返回 undefined

2.4 函數內部的 arguments 對象

JavaScript 中,函數的內部都有一個 arguments 對象,用來記錄在調用函數時所傳進來的參數,可以說是一個偽數組。

網絡爬蟲編程 JavaScript函數對象15

網絡爬蟲編程 JavaScript函數對象16

這個對象可以用于當我們需要傳進來的參數個數不確定時就可以使用這個,就比如求一堆數的和。

網絡爬蟲編程 JavaScript函數對象17

2.5 匿名函數

匿名函數就是沒有名字的函數,當我們只需要只需要調用一次的話就可以使用匿名函數,或者需要回調函數的時候就會使用匿名函數,至于什么是回調函數,以后遇到了就說,匿名函數聲明如下:

網絡爬蟲編程 JavaScript函數對象18

這是將匿名函數賦值給一變量,然后可以通過該變量進行調用,也可以傳參的,除了這樣子調用匿名函數,匿名函數還可以進行自調用。

網絡爬蟲編程 JavaScript函數對象19

這里需要注意的是在自調用的時候別忘了定義函數的部分需要加括號括起來。這自調用的匿名函數就常用于防止全局被污染,就是當你寫的代碼量大了,難免會有些全局變量會有重名的可能,這時候使用匿名函數自調用就可以新開辟了一個作用域,不同作用域的變量就算同名也不怕了,至于具體的后面我也會應用到,到時再詳講。

2.6 函數其他

  • 函數也是一種數據類型,可以說是一個對象吧,至于具體的后面再詳講,現在了解就好。

網絡爬蟲編程 JavaScript函數對象20

  • 函數不僅可以作為參數進行傳遞,還可以作為返回值,畢竟函數也是一種數據類型。作為參數傳遞主要就是我們所說的回調函數,遇到就會說,作為返回值的應用,閉包就是一個應用,也不多說,以后會講。

2.7. 作用域

作用域就是變量可以起作用的范圍,在 JavaScript 中定義的變量符合詞法作用域,就是說變量的作用域是在定義時決定的,不是在執行時決定的,即變量作用域只需要通過源碼分析就知道了。

1. JavaScript 中 詞法作用域的規則為:

  • 函數內部的變量允許訪問函數外部的。

  • 整個代碼結構只能函數限定作用域,這就是為什么上文說使用自調用函數來開辟新的作用域的原因了。

  • 作用域規則首先使用提升規則分析,下文說的預解析就是這個

  • 如果當前作用域有該變量了,就不會考慮外面的了。

2. 下面再看看 JavaScript 中三種作用域

  • 全局作用域:JavaScript 中認為在函數外部定義的變量就是全局變量,而這個全局變量所在的作用域就是全局作用域。

  • 局部作用域:在函數內部就是局部作用域,在這里定義的內部變量也就是局部變量。

  • 塊級作用域:這個是 ES6 才有的,簡單說下,就是只使用一對大括號{} 括起來的就是塊級作用域。

3. 作用域鏈

只有函數才可以限定作用域,那么在要有代碼,這里就至少存在一個全局作用域,而寫代碼難免又會有函數,這里的函數就會構成另一個作用域,如果函數中還有函數,則他還會構成一個新的作用域,等等。將上面的這些作用域列出來,就會形成一個結構,這個結構就是作用域鏈。如下面代碼:

網絡爬蟲編程 JavaScript函數對象21

按照全局作用域就是 0 級鏈,函數就是 1 級鏈,函數的函數就是 2級鏈,就會有下圖:

網絡爬蟲編程 JavaScript函數對象22

2.8 預解析

JavaScript 的解釋器在執行代碼的時候有兩個過程,就是預解析和再從上往下執行代碼過程。預解析就是先把代碼中的變量提升,然后函數提升,接著再執行代碼。

  • 變量提升:變量的聲明會被提升到作用域的最上面,注不會將賦值提升。

  • 函數提升:把當前作用域的函數聲明提升到當前作用域的最上面。

如果你懂了再看看下面幾段代碼會不會報錯?

1.

網絡爬蟲編程 JavaScript函數對象23

解答:不會報錯,因為經過預解析后代碼成這樣

網絡爬蟲編程 JavaScript函數對象24

2.

網絡爬蟲編程 JavaScript函數對象25

解答:也不會報錯,不過 a 打印的值為 undefined

網絡爬蟲編程 JavaScript函數對象26

3.

網絡爬蟲編程 JavaScript函數對象27

解答:會報錯,原因可以結合上下兩張圖看即可。

網絡爬蟲編程 JavaScript函數對象28

3. 對象 object

對象是一個具體的事物,比如你和我都是對象,但是汽車和手機不是事物,可以說它們是一個類別。

JavaScript 中的對象可以說是一個無序的屬性的集合,屬性可以包括基本值、對象或函數,也可以把 JavaScript 中的對象想像為一組鍵值對。

把現實中的事物抽象為代碼中的對象,其的特征可以作為對象的屬性,其的行為可以作為方法。

3.1 創建對象

JavaScript 中創建對象的方法有四種,并不像其他語言中只能通過 new 來創建。

  • 直接聲明一個鍵值對的集合

網絡爬蟲編程 JavaScript函數對象29

這個 obj 變量就是一個對象了里面有兩個屬性和一個方法。使用這種方法也只適合創建一個類,因為當需要創建大量同類型的對象時,使用這個方法就需要寫大量的方法。

  • 使用 new Object() 創建

網絡爬蟲編程 JavaScript函數對象30

這個是先創建一個空對象,然后動態增加對象的屬性和方法,也是只適合創建只有一個對象的類型,還不如第一種,也不推薦。

  • 使用工廠模式創建

網絡爬蟲編程 JavaScript函數對象31

這種方法就是使用一個模板函數,就相當于一個工廠,還有記得返回創建的對象。當需要創建對象的時候只需要調用一下函數傳參就可以了,就比上面兩種代碼的復用性提高了。

但是這有一個問題,我們在判斷對象類型的時候,結果都是 Object

判斷對象類型使用 instanceof,而使用 typeof 判斷對象,無論什么對象的結果都是 Object

網絡爬蟲編程 JavaScript函數對象32

  • 自定義構造函數來創建

網絡爬蟲編程 JavaScript函數對象33

這個自定義構造函數名字需要首字母大寫,當然這只是個規范而已

里面使用了 this 關鍵字,這個 this 的指向就是使用構造函數創建的對象,也不需要返回 對象了。

網絡爬蟲編程 JavaScript函數對象34

注意:創建對象也需要使用 new 關鍵字,如上圖,通過這種方法就既可以創建大量同類型的對象,也可以判斷所屬類型,非常方便。

這個 new 創建對象的過程為:

  1. 內存中先創建一個空的對象

  2. 讓構造函數的 this 指向剛剛創建的對象

  3. 執行構造函數內部的屬性和方法定義

  4. 返回當前對象

3.2 對象屬性和方法的相關操作

  • 訪問屬性語法為對象.屬性,還可以 對象[‘屬性名’] 這樣, 當然也可以通過這兩個來修改對象屬性的值

網絡爬蟲編程 JavaScript函數對象35

網絡爬蟲編程 JavaScript函數對象36

當然,當對一個不存在的屬性訪問的時候就會返回 undefined,若是修改一個不存在的屬性就是向該對象動態增加一個新的屬性。

這兩種方法推薦第二種,因為有時我們得到的屬性是一個變量名,并不知道具體的名字,這時候就只能使用第二種方法

  • 訪問方法直接使用 對象.函數名() 即可

網絡爬蟲編程 JavaScript函數對象37

  • 遍歷對象成員

可以使用 for…in… 語句

網絡爬蟲編程 JavaScript函數對象38

  • 刪除對象成員

使用 delete 關鍵字

網絡爬蟲編程 JavaScript函數對象39

3.3 簡單數據類型和復雜數據類型的區別

基本類型又叫做值類型,復雜類型又叫做引用類型

值類型:簡單數據類型,基本數據類型,在存儲時,變量中存儲的是值本身,因此叫做值類型。

引用類型:復雜數據類型,在存儲時,變量中存儲的僅僅是地址(引用),因此叫做引用數據類型,終于寫完了。

文章評論

服務器推薦

打賞本站

  • 如果您覺得本站很棒,能給您提供些許幫助,可以通過掃碼支付打賞哦!
  • 微信掃碼:你說多少就多少~
  • 支付寶掃碼:你說多少就多少~
  • 實在不想出錢 那就領個紅包吧~
30选5开奖号码结果今天