成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

爬蟲不得不學(xué)之 JavaScript 函數(shù)對象篇

Terry_Tai / 681人閱讀

摘要:所以語句也會常常用于終止函數(shù)的運行,還有也可以不寫語句,但是會默認(rèn)返回函數(shù)內(nèi)部的對象中,函數(shù)的內(nèi)部都有一個對象,用來記錄在調(diào)用函數(shù)時所傳進(jìn)來的參數(shù),可以說是一個偽數(shù)組。里面使用了關(guān)鍵字,這個的指向就是使用構(gòu)造函數(shù)創(chuàng)建的對象,也不需要返回對

今天好像是情人節(jié)?所以最適合面向?qū)ο螅琂avaScript 也有對象,我們也可以隨時面向?qū)ο?,方便得很,那怎樣才有對象呢?下面告訴你!

1. 數(shù)組

數(shù)組,字面意思就是一堆數(shù)的組合,但是它是有順序的,學(xué)了數(shù)組就不僅可以存儲一個數(shù)據(jù),還可以存儲一堆數(shù)據(jù),這就是我們?yōu)槭裁磳W(xué)了簡單數(shù)據(jù)類型之后還要學(xué)數(shù)組的原因。

1.1 聲明數(shù)組

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

1.2 遍歷數(shù)組

遍歷數(shù)組,根據(jù)數(shù)組長度可以輕易知道循環(huán)次數(shù),所以可以使用 for 循環(huán),獲取數(shù)組的長度可以通過?length?屬性進(jìn)行獲取。

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

1.3 清空數(shù)組

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

1.4 數(shù)組小練習(xí)

找出數(shù)組中最大的值

這個直接通過遍歷數(shù)組,然后將每個值進(jìn)行比較即可,很容易。

翻轉(zhuǎn)數(shù)組

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

2. 函數(shù)

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

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

2.1 函數(shù)的定義

函數(shù)定義這里有兩種方法,如下:

使用函數(shù)聲明,語法為

使用函數(shù)表達(dá)式,語法為:

上面只是函數(shù)的定義而已,并不會去執(zhí)行,只有你調(diào)用函數(shù)的時候才會去執(zhí)行。

2.2 函數(shù)調(diào)用

調(diào)用函數(shù)的語法也比較簡單,就是函數(shù)加上一個括號就行了。

所以當(dāng)需要多次使用這段功能的時候,就多次調(diào)用即可,不需要每次都寫一段相同的代碼。

2.3 函數(shù)參數(shù)

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

函數(shù)的參數(shù)定義與調(diào)用語法:

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

實參:在函數(shù)聲明設(shè)置的形參,我們調(diào)用函數(shù)就需要傳入對應(yīng)的參數(shù),而這個參數(shù)就是實參。

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

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

2.4 函數(shù)內(nèi)部的 arguments 對象

JavaScript 中,函數(shù)的內(nèi)部都有一個 arguments 對象,用來記錄在調(diào)用函數(shù)時所傳進(jìn)來的參數(shù),可以說是一個偽數(shù)組。

這個對象可以用于當(dāng)我們需要傳進(jìn)來的參數(shù)個數(shù)不確定時就可以使用這個,就比如求一堆數(shù)的和。

2.5 匿名函數(shù)

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

這是將匿名函數(shù)賦值給一變量,然后可以通過該變量進(jìn)行調(diào)用,也可以傳參的,除了這樣子調(diào)用匿名函數(shù),匿名函數(shù)還可以進(jìn)行自調(diào)用。

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

2.6 函數(shù)其他

函數(shù)也是一種數(shù)據(jù)類型,可以說是一個對象吧,至于具體的后面再詳講,現(xiàn)在了解就好。

函數(shù)不僅可以作為參數(shù)進(jìn)行傳遞,還可以作為返回值,畢竟函數(shù)也是一種數(shù)據(jù)類型。作為參數(shù)傳遞主要就是我們所說的回調(diào)函數(shù),遇到就會說,作為返回值的應(yīng)用,閉包就是一個應(yīng)用,也不多說,以后會講。

2.7. 作用域

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

1. JavaScript 中 詞法作用域的規(guī)則為:

函數(shù)內(nèi)部的變量允許訪問函數(shù)外部的。

整個代碼結(jié)構(gòu)只能函數(shù)限定作用域,這就是為什么上文說使用自調(diào)用函數(shù)來開辟新的作用域的原因了。

作用域規(guī)則首先使用提升規(guī)則分析,下文說的預(yù)解析就是這個

如果當(dāng)前作用域有該變量了,就不會考慮外面的了。

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

全局作用域:JavaScript 中認(rèn)為在函數(shù)外部定義的變量就是全局變量,而這個全局變量所在的作用域就是全局作用域。

局部作用域:在函數(shù)內(nèi)部就是局部作用域,在這里定義的內(nèi)部變量也就是局部變量。

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

3. 作用域鏈

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

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

2.8 預(yù)解析

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

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

函數(shù)提升:把當(dāng)前作用域的函數(shù)聲明提升到當(dāng)前作用域的最上面。

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

1.

解答:不會報錯,因為經(jīng)過預(yù)解析后代碼成這樣

2.

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

3.

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

3. 對象 object

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

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

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

3.1 創(chuàng)建對象

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

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

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

使用 new Object() 創(chuàng)建

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

使用工廠模式創(chuàng)建

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

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

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

自定義構(gòu)造函數(shù)來創(chuàng)建

這個自定義構(gòu)造函數(shù)名字需要首字母大寫,當(dāng)然這只是個規(guī)范而已。

里面使用了 this 關(guān)鍵字,這個?this 的指向就是使用構(gòu)造函數(shù)創(chuàng)建的對象,也不需要返回 對象了。

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

這個?new 創(chuàng)建對象的過程為:

在內(nèi)存中先創(chuàng)建一個空的對象

讓構(gòu)造函數(shù)的 this 指向剛剛創(chuàng)建的對象

執(zhí)行構(gòu)造函數(shù)內(nèi)部的屬性和方法定義

返回當(dāng)前對象

3.2 對象屬性和方法的相關(guān)操作

訪問屬性語法為對象.屬性,還可以?對象["屬性名"]?這樣, 當(dāng)然也可以通過這兩個來修改對象屬性的值

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

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

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

遍歷對象成員

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

刪除對象成員

使用?delete?關(guān)鍵字

3.3 簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型的區(qū)別

基本類型又叫做值類型,復(fù)雜類型又叫做引用類型

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

引用類型:復(fù)雜數(shù)據(jù)類型,在存儲時,變量中存儲的僅僅是地址(引用),因此叫做引用數(shù)據(jù)類型。

終于寫完了,下一篇常用內(nèi)置對象走起。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101687.html

相關(guān)文章

  • 爬蟲得不學(xué)之 JavaScript 入門

    摘要:為數(shù)值固定的表示法,用來表示整數(shù)和浮點數(shù)的。無論你寫何種進(jìn)制,它的存儲還是以二進(jìn)制來存儲的,所以這樣就弄成了浮點數(shù)的存儲精確度,浮點數(shù)只能精確到位小數(shù)。關(guān)系運算符關(guān)系運算符有和。賦值運算符賦值運算符有六個。 現(xiàn)在的爬蟲越來越難了,不再和之前的那樣,隨便抓個包就可以找到相關(guān)的 url ,然后 post 一下或者 get 一下數(shù)據(jù)就出來了。還有一個可能就是可能你以前用來學(xué)習(xí)的爬蟲網(wǎng)站太簡單...

    tracymac7 評論0 收藏0
  • 如果有人問你爬蟲抓取技術(shù)的門道,請叫他來看這文章

    摘要:未授權(quán)的爬蟲抓取程序是危害原創(chuàng)內(nèi)容生態(tài)的一大元兇,因此要保護(hù)網(wǎng)站的內(nèi)容,首先就要考慮如何反爬蟲。反爬蟲的銀彈目前的反抓取機(jī)器人檢查手段,最可靠的還是驗證碼技術(shù)。機(jī)器人協(xié)議除此之外,在爬蟲抓取技術(shù)領(lǐng)域還有一個白道的手段,叫做協(xié)議。 本文首發(fā)于我的個人博客,同步發(fā)布于SegmentFault專欄,非商業(yè)轉(zhuǎn)載請注明出處,商業(yè)轉(zhuǎn)載請閱讀原文鏈接里的法律聲明。 web是一個開放的平臺,這也奠定了...

    raoyi 評論0 收藏0
  • 基礎(chǔ)知識 - 收藏集 - 掘金

    摘要:本文是面向前端小白的,大手子可以跳過,寫的不好之處多多分鐘搞定常用基礎(chǔ)知識前端掘金基礎(chǔ)智商劃重點在實際開發(fā)中,已經(jīng)非常普及了。 JavaScript字符串所有API全解密 - 掘金關(guān)于 我的博客:louis blog SF專欄:路易斯前端深度課 原文鏈接:JavaScript字符串所有API全解密 本文近 6k 字,讀完需 10 分鐘。 字符串作為基本的信息交流的橋梁,幾乎被所有的編程...

    wdzgege 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠(yuǎn)都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.40 - 2018,來學(xué)習(xí)一門新的編程語言吧!

    摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗,增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...

    caspar 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<