爬蟲不得不學之 JavaScript 函數對象篇

今天好像是情人節?因此最適合面向對象,JavaScript 也有對象,咱們也能夠隨時面向對象,方便得很,那怎樣纔有對象呢?下面告訴你!python


1. 數組

數組,字面意思就是一堆數的組合,可是它是有順序的,學了數組就不只能夠存儲一個數據,還能夠存儲一堆數據,這就是咱們爲何學了簡單數據類型以後還要學數組的緣由。數組

1.1 聲明數組

能夠看到,數組裏面的定義和 python 裏的差很少,也能夠存儲不一樣數據類型。獲取數組元素也是同樣經過下標獲取,下標從 0 開始,並且 JavaScript 的數組能夠隨意根據下標進行賦值,無論你的數組長度,由於 JavaScript 的數組長度是動態的。閉包

1.2 遍歷數組

遍歷數組,根據數組長度能夠輕易知道循環次數,因此可使用 for 循環,獲取數組的長度能夠經過 length 屬性進行獲取。函數

這裏有個提升效率的地方,就是在獲取數組的長度時放在了 for 語句的初始化表達式裏,而不是放在判斷表達式裏,當你這個值須要運算才能得到的時候,這樣作就能夠不用在每次判斷時都須要經過運算得到,減小運算,也就提升效率了,固然,數組的長度在這裏只是一個屬性,不須要運算,放不放在初始化表達式都差很少。源碼分析

1.3 清空數組

JavaScript 這裏清空數組簡單粗暴,直接將長度賦值爲 0 便可。this

1.4 數組小練習

  • 找出數組中最大的值3d

這個直接經過遍歷數組,而後將每一個值進行比較便可,很容易。cdn

  • 翻轉數組對象

這個就是將數組中的元素先後互相替換,也很少說了。blog


2. 函數

當咱們須要在對多個數組進行上面的其中練習之一,好比進行尋找最大值,咱們總不能每一個數組都各自寫一段尋找最大值的代碼,不然這樣子的話代碼的複用性過低了。

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

2.1 函數的定義

函數定義這裏有兩種方法,以下:

  • 使用函數聲明,語法爲

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

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

2.2 函數調用

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

因此當須要屢次使用這段功能的時候,就屢次調用便可,不須要每次都寫一段相同的代碼。

2.3 函數參數

不須要屢次寫同一段代碼解決了,可是當有不一樣的數據內容參與運算時,好像我還須要重複寫呀!就好比前面說的求數組最大值。這個時候就須要咱們的函數參數了,函數參數就是解決這個不肯定的數據內容的。當咱們須要對不肯定數據內容進行操做時,只須要在調用函數的時候把數據內容看成參數傳進去便可。

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

  • 形參:在聲明函數時,有些值是固定的,而有些值不是固定的,對於這些不固定的值,咱們能夠給它們設置參數,可是這個參數不是具體的值,只是一個形式而已,因此叫作形參

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

瞭解了這個以後,是否是很容易就能夠寫出一個求數組最大值的函數了?

咦?上面的我都看明白了,可是 return 那個語句又是什麼?return 後面跟的內容就是函數的返回值,當函數運行到這裏的時候就會結束函數而且把該值返回給調用處,就相對於一段代碼執行以後的反饋因此 return 語句也會經常用於終止函數的運行,還有也能夠不寫 return 語句,可是會默認返回 undefined

2.4 函數內部的 arguments 對象

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

這個對象能夠用於當咱們須要傳進來的參數個數不肯定時就可使用這個,就好比求一堆數的和。

2.5 匿名函數

匿名函數就是沒有名字的函數,當咱們只須要只須要調用一次的話就可使用匿名函數,或者須要回調函數的時候就會使用匿名函數,至於什麼是回調函數,之後遇到了就說,匿名函數聲明以下:

這是將匿名函數賦值給一變量,而後能夠經過該變量進行調用,也能夠傳參的,除了這樣子調用匿名函數,匿名函數還能夠進行自調用。

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

2.6 函數其餘

  • 函數也是一種數據類型,能夠說是一個對象吧,至於具體的後面再詳講,如今瞭解就好。

  • 函數不只能夠做爲參數進行傳遞,還能夠做爲返回值,畢竟函數也是一種數據類型。做爲參數傳遞主要就是咱們所說的回調函數,遇到就會說,做爲返回值的應用,閉包就是一個應用,也很少說,之後會講。

2.7. 做用域

做用域就是變量能夠起做用的範圍,在 JavaScript 中定義的變量符合詞法做用域,就是說變量的做用域是在定義時決定的,不是在執行時決定的,即變量做用域只須要經過源碼分析就知道了。

1. JavaScript 中 詞法做用域的規則爲:

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

  • 整個代碼結構只能函數限定做用域,這就是爲何上文說使用自調用函數來開闢新的做用域的緣由了。

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

  • 若是當前做用域有該變量了,就不會考慮外面的了。

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

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

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

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

3. 做用域鏈

只有函數才能夠限定做用域,那麼在要有代碼,這裏就至少存在一個全局做用域,而寫代碼不免又會有函數,這裏的函數就會構成另外一個做用域,若是函數中還有函數,則他還會構成一個新的做用域,等等。將上面的這些做用域列出來,就會造成一個結構,這個結構就是做用域鏈。以下面代碼:

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


2.8 預解析

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

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

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

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

1.

解答:不會報錯,由於通過預解析後代碼成這樣

2.

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

3.

解答:會報錯,緣由能夠結合上下兩張圖看便可。


3. 對象 object

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

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

把現實中的事物抽象爲代碼中的對象,其的特徵能夠做爲對象的屬性,其的行爲能夠做爲方法。

3.1 建立對象

JavaScript 中建立對象的方法有四種,並不像其餘語言中只能經過 new 來建立。

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

這個 obj 變量就是一個對象了裏面有兩個屬性和一個方法。使用這種方法也只適合建立一個類,由於當須要建立大量同類型的對象時,使用這個方法就須要寫大量的方法。

  • 使用 new Object() 建立

這個是先建立一個空對象,而後動態增長對象的屬性和方法,也是隻適合建立只有一個對象的類型,還不如第一種,也不推薦。

  • 使用工廠模式建立

這種方法就是使用一個模板函數,就至關於一個工廠,還有記得返回建立的對象。當須要建立對象的時候只須要調用一下函數傳參就能夠了,就比上面兩種代碼的複用性提升了。

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

判斷對象類型使用 instanceof,而使用 typeof 判斷對象,不管什麼對象的結果都是 Object

  • 自定義構造函數來建立

這個自定義構造函數名字須要首字母大寫,固然這只是個規範而已

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

注意:建立對象也須要使用 new 關鍵字,如上圖,經過這種方法就既能夠建立大量同類型的對象,也能夠判斷所屬類型,很是方便。

這個 new 建立對象的過程爲:

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

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

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

  4. 返回當前對象

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

  • 訪問屬性語法爲對象.屬性,還能夠 對象['屬性名'] 這樣, 固然也能夠經過這兩個來修改對象屬性的值

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

這兩種方法推薦第二種,由於有時咱們獲得的屬性是一個變量名,並不知道具體的名字,這時候就只能使用第二種方法

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

  • 遍歷對象成員

可使用 for...in... 語句

  • 刪除對象成員

使用 delete 關鍵字

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

基本類型又叫作值類型,複雜類型又叫作引用類型

值類型:簡單數據類型,基本數據類型,在存儲時,變量中存儲的是值自己,所以叫作值類型。

引用類型:複雜數據類型,在存儲時,變量中存儲的僅僅是地址(引用),所以叫作引用數據類型。

終於寫完了,下一篇經常使用內置對象走起。

相關文章
相關標籤/搜索