摘要:所以語(yǔ)句也會(huì)常常用于終止函數(shù)的運(yùn)行,還有也可以不寫(xiě)語(yǔ)句,但是會(huì)默認(rèn)返回函數(shù)內(nèi)部的對(duì)象中,函數(shù)的內(nèi)部都有一個(gè)對(duì)象,用來(lái)記錄在調(diào)用函數(shù)時(shí)所傳進(jìn)來(lái)的參數(shù),可以說(shuō)是一個(gè)偽數(shù)組。里面使用了關(guān)鍵字,這個(gè)的指向就是使用構(gòu)造函數(shù)創(chuàng)建的對(duì)象,也不需要返回對(duì)
今天好像是情人節(jié)?所以最適合面向?qū)ο?,JavaScript 也有對(duì)象,我們也可以隨時(shí)面向?qū)ο?,方便得很,那怎樣才有?duì)象呢?下面告訴你!
1. 數(shù)組數(shù)組,字面意思就是一堆數(shù)的組合,但是它是有順序的,學(xué)了數(shù)組就不僅可以存儲(chǔ)一個(gè)數(shù)據(jù),還可以存儲(chǔ)一堆數(shù)據(jù),這就是我們?yōu)槭裁磳W(xué)了簡(jiǎn)單數(shù)據(jù)類(lèi)型之后還要學(xué)數(shù)組的原因。
1.1 聲明數(shù)組可以看到,數(shù)組里面的定義和 python 里的差不多,也可以存儲(chǔ)不同數(shù)據(jù)類(lèi)型。獲取數(shù)組元素也是一樣通過(guò)下標(biāo)獲取,下標(biāo)從 0 開(kāi)始,而且 JavaScript 的數(shù)組可以隨意根據(jù)下標(biāo)進(jìn)行賦值,不管你的數(shù)組長(zhǎng)度,因?yàn)?JavaScript 的數(shù)組長(zhǎng)度是動(dòng)態(tài)的。
1.2 遍歷數(shù)組遍歷數(shù)組,根據(jù)數(shù)組長(zhǎng)度可以輕易知道循環(huán)次數(shù),所以可以使用 for 循環(huán),獲取數(shù)組的長(zhǎng)度可以通過(guò)?length?屬性進(jìn)行獲取。
這里有個(gè)提高效率的地方,就是在獲取數(shù)組的長(zhǎng)度時(shí)放在了 for 語(yǔ)句的初始化表達(dá)式里,而不是放在判斷表達(dá)式里,當(dāng)你這個(gè)值需要運(yùn)算才能獲得的時(shí)候,這樣做就可以不用在每次判斷時(shí)都需要通過(guò)運(yùn)算獲得,減少運(yùn)算,也就提高效率了,當(dāng)然,數(shù)組的長(zhǎng)度在這里只是一個(gè)屬性,不需要運(yùn)算,放不放在初始化表達(dá)式都差不多。
1.3 清空數(shù)組JavaScript 這里清空數(shù)組簡(jiǎn)單粗暴,直接將長(zhǎng)度賦值為 0?即可。
1.4 數(shù)組小練習(xí)找出數(shù)組中最大的值
這個(gè)直接通過(guò)遍歷數(shù)組,然后將每個(gè)值進(jìn)行比較即可,很容易。
翻轉(zhuǎn)數(shù)組
這個(gè)就是將數(shù)組中的元素前后互相替換,也不多說(shuō)了。
2. 函數(shù)當(dāng)我們需要在對(duì)多個(gè)數(shù)組進(jìn)行上面的其中練習(xí)之一,比如進(jìn)行尋找最大值,我們總不能每個(gè)數(shù)組都各自寫(xiě)一段尋找最大值的代碼,否則這樣子的話代碼的復(fù)用性太低了。
函數(shù)的出現(xiàn)就是解決這個(gè)問(wèn)題的,函數(shù)就是把一段相對(duì)獨(dú)立的具有特定功能的代碼抽取出來(lái)進(jìn)行封裝,形成一個(gè)獨(dú)立的個(gè)體。當(dāng)需要多次使用的時(shí)候,我們只需要使用函數(shù)名調(diào)用即可。
2.1 函數(shù)的定義函數(shù)定義這里有兩種方法,如下:
使用函數(shù)聲明,語(yǔ)法為
使用函數(shù)表達(dá)式,語(yǔ)法為:
上面只是函數(shù)的定義而已,并不會(huì)去執(zhí)行,只有你調(diào)用函數(shù)的時(shí)候才會(huì)去執(zhí)行。
2.2 函數(shù)調(diào)用調(diào)用函數(shù)的語(yǔ)法也比較簡(jiǎn)單,就是函數(shù)加上一個(gè)括號(hào)就行了。
所以當(dāng)需要多次使用這段功能的時(shí)候,就多次調(diào)用即可,不需要每次都寫(xiě)一段相同的代碼。
2.3 函數(shù)參數(shù)不需要多次寫(xiě)同一段代碼解決了,但是當(dāng)有不同的數(shù)據(jù)內(nèi)容參與運(yùn)算時(shí),好像我還需要重復(fù)寫(xiě)呀!就比如前面說(shuō)的求數(shù)組最大值。這個(gè)時(shí)候就需要我們的函數(shù)參數(shù)了,函數(shù)參數(shù)就是解決這個(gè)不確定的數(shù)據(jù)內(nèi)容的。當(dāng)我們需要對(duì)不確定數(shù)據(jù)內(nèi)容進(jìn)行操作時(shí),只需要在調(diào)用函數(shù)的時(shí)候把數(shù)據(jù)內(nèi)容當(dāng)作參數(shù)傳進(jìn)去即可。
函數(shù)的參數(shù)定義與調(diào)用語(yǔ)法:
形參:在聲明函數(shù)時(shí),有些值是固定的,而有些值不是固定的,對(duì)于這些不固定的值,我們可以給它們?cè)O(shè)置參數(shù),但是這個(gè)參數(shù)不是具體的值,只是一個(gè)形式而已,所以叫做形參
實(shí)參:在函數(shù)聲明設(shè)置的形參,我們調(diào)用函數(shù)就需要傳入對(duì)應(yīng)的參數(shù),而這個(gè)參數(shù)就是實(shí)參。
了解了這個(gè)之后,是不是很容易就可以寫(xiě)出一個(gè)求數(shù)組最大值的函數(shù)了?
咦?上面的我都看明白了,但是?return?那個(gè)語(yǔ)句又是什么?return 后面跟的內(nèi)容就是函數(shù)的返回值,當(dāng)函數(shù)運(yùn)行到這里的時(shí)候就會(huì)結(jié)束函數(shù)并且把該值返回給調(diào)用處,就相對(duì)于一段代碼執(zhí)行之后的反饋。所以 return 語(yǔ)句也會(huì)常常用于終止函數(shù)的運(yùn)行,還有也可以不寫(xiě) return 語(yǔ)句,但是會(huì)默認(rèn)返回 undefined
2.4 函數(shù)內(nèi)部的 arguments 對(duì)象JavaScript 中,函數(shù)的內(nèi)部都有一個(gè) arguments 對(duì)象,用來(lái)記錄在調(diào)用函數(shù)時(shí)所傳進(jìn)來(lái)的參數(shù),可以說(shuō)是一個(gè)偽數(shù)組。
這個(gè)對(duì)象可以用于當(dāng)我們需要傳進(jìn)來(lái)的參數(shù)個(gè)數(shù)不確定時(shí)就可以使用這個(gè),就比如求一堆數(shù)的和。
2.5 匿名函數(shù)匿名函數(shù)就是沒(méi)有名字的函數(shù),當(dāng)我們只需要只需要調(diào)用一次的話就可以使用匿名函數(shù),或者需要回調(diào)函數(shù)的時(shí)候就會(huì)使用匿名函數(shù),至于什么是回調(diào)函數(shù),以后遇到了就說(shuō),匿名函數(shù)聲明如下:
這是將匿名函數(shù)賦值給一變量,然后可以通過(guò)該變量進(jìn)行調(diào)用,也可以傳參的,除了這樣子調(diào)用匿名函數(shù),匿名函數(shù)還可以進(jìn)行自調(diào)用。
這里需要注意的是在自調(diào)用的時(shí)候別忘了定義函數(shù)的部分需要加括號(hào)括起來(lái)。這自調(diào)用的匿名函數(shù)就常用于防止全局被污染,就是當(dāng)你寫(xiě)的代碼量大了,難免會(huì)有些全局變量會(huì)有重名的可能,這時(shí)候使用匿名函數(shù)自調(diào)用就可以新開(kāi)辟了一個(gè)作用域,不同作用域的變量就算同名也不怕了,至于具體的后面我也會(huì)應(yīng)用到,到時(shí)再詳講。
2.6 函數(shù)其他函數(shù)也是一種數(shù)據(jù)類(lèi)型,可以說(shuō)是一個(gè)對(duì)象吧,至于具體的后面再詳講,現(xiàn)在了解就好。
函數(shù)不僅可以作為參數(shù)進(jìn)行傳遞,還可以作為返回值,畢竟函數(shù)也是一種數(shù)據(jù)類(lèi)型。作為參數(shù)傳遞主要就是我們所說(shuō)的回調(diào)函數(shù),遇到就會(huì)說(shuō),作為返回值的應(yīng)用,閉包就是一個(gè)應(yīng)用,也不多說(shuō),以后會(huì)講。
2.7. 作用域作用域就是變量可以起作用的范圍,在 JavaScript 中定義的變量符合詞法作用域,就是說(shuō)變量的作用域是在定義時(shí)決定的,不是在執(zhí)行時(shí)決定的,即變量作用域只需要通過(guò)源碼分析就知道了。
1. JavaScript 中 詞法作用域的規(guī)則為:
函數(shù)內(nèi)部的變量允許訪問(wèn)函數(shù)外部的。
整個(gè)代碼結(jié)構(gòu)只能函數(shù)限定作用域,這就是為什么上文說(shuō)使用自調(diào)用函數(shù)來(lái)開(kāi)辟新的作用域的原因了。
作用域規(guī)則首先使用提升規(guī)則分析,下文說(shuō)的預(yù)解析就是這個(gè)
如果當(dāng)前作用域有該變量了,就不會(huì)考慮外面的了。
2. 下面再看看 JavaScript 中三種作用域
全局作用域:JavaScript 中認(rèn)為在函數(shù)外部定義的變量就是全局變量,而這個(gè)全局變量所在的作用域就是全局作用域。
局部作用域:在函數(shù)內(nèi)部就是局部作用域,在這里定義的內(nèi)部變量也就是局部變量。
塊級(jí)作用域:這個(gè)是 ES6 才有的,簡(jiǎn)單說(shuō)下,就是只使用一對(duì)大括號(hào){}?括起來(lái)的就是塊級(jí)作用域。
3. 作用域鏈
只有函數(shù)才可以限定作用域,那么在要有代碼,這里就至少存在一個(gè)全局作用域,而寫(xiě)代碼難免又會(huì)有函數(shù),這里的函數(shù)就會(huì)構(gòu)成另一個(gè)作用域,如果函數(shù)中還有函數(shù),則他還會(huì)構(gòu)成一個(gè)新的作用域,等等。將上面的這些作用域列出來(lái),就會(huì)形成一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu)就是作用域鏈。如下面代碼:
按照全局作用域就是 0 級(jí)鏈,函數(shù)就是 1 級(jí)鏈,函數(shù)的函數(shù)就是 2級(jí)鏈,就會(huì)有下圖:
2.8 預(yù)解析JavaScript 的解釋器在執(zhí)行代碼的時(shí)候有兩個(gè)過(guò)程,就是預(yù)解析和再?gòu)纳贤聢?zhí)行代碼過(guò)程。預(yù)解析就是先把代碼中的變量提升,然后函數(shù)提升,接著再執(zhí)行代碼。
變量提升:變量的聲明會(huì)被提升到作用域的最上面,注不會(huì)將賦值提升。
函數(shù)提升:把當(dāng)前作用域的函數(shù)聲明提升到當(dāng)前作用域的最上面。
如果你懂了再看看下面幾段代碼會(huì)不會(huì)報(bào)錯(cuò)?
1.
解答:不會(huì)報(bào)錯(cuò),因?yàn)榻?jīng)過(guò)預(yù)解析后代碼成這樣
2.
解答:也不會(huì)報(bào)錯(cuò),不過(guò) a 打印的值為 undefined
3.
解答:會(huì)報(bào)錯(cuò),原因可以結(jié)合上下兩張圖看即可。
3. 對(duì)象 object對(duì)象是一個(gè)具體的事物,比如你和我都是對(duì)象,但是汽車(chē)和手機(jī)不是事物,可以說(shuō)它們是一個(gè)類(lèi)別。
JavaScript 中的對(duì)象可以說(shuō)是一個(gè)無(wú)序的屬性的集合,屬性可以包括基本值、對(duì)象或函數(shù),也可以把 JavaScript 中的對(duì)象想像為一組鍵值對(duì)。
把現(xiàn)實(shí)中的事物抽象為代碼中的對(duì)象,其的特征可以作為對(duì)象的屬性,其的行為可以作為方法。
3.1 創(chuàng)建對(duì)象JavaScript 中創(chuàng)建對(duì)象的方法有四種,并不像其他語(yǔ)言中只能通過(guò) new 來(lái)創(chuàng)建。
直接聲明一個(gè)鍵值對(duì)的集合
這個(gè) obj 變量就是一個(gè)對(duì)象了里面有兩個(gè)屬性和一個(gè)方法。使用這種方法也只適合創(chuàng)建一個(gè)類(lèi),因?yàn)楫?dāng)需要?jiǎng)?chuàng)建大量同類(lèi)型的對(duì)象時(shí),使用這個(gè)方法就需要寫(xiě)大量的方法。
使用 new Object() 創(chuàng)建
這個(gè)是先創(chuàng)建一個(gè)空對(duì)象,然后動(dòng)態(tài)增加對(duì)象的屬性和方法,也是只適合創(chuàng)建只有一個(gè)對(duì)象的類(lèi)型,還不如第一種,也不推薦。
使用工廠模式創(chuàng)建
這種方法就是使用一個(gè)模板函數(shù),就相當(dāng)于一個(gè)工廠,還有記得返回創(chuàng)建的對(duì)象。當(dāng)需要?jiǎng)?chuàng)建對(duì)象的時(shí)候只需要調(diào)用一下函數(shù)傳參就可以了,就比上面兩種代碼的復(fù)用性提高了。
但是這有一個(gè)問(wèn)題,我們?cè)谂袛鄬?duì)象類(lèi)型的時(shí)候,結(jié)果都是 Object
判斷對(duì)象類(lèi)型使用 instanceof,而使用 typeof 判斷對(duì)象,無(wú)論什么對(duì)象的結(jié)果都是 Object
自定義構(gòu)造函數(shù)來(lái)創(chuàng)建
這個(gè)自定義構(gòu)造函數(shù)名字需要首字母大寫(xiě),當(dāng)然這只是個(gè)規(guī)范而已。
里面使用了 this 關(guān)鍵字,這個(gè)?this 的指向就是使用構(gòu)造函數(shù)創(chuàng)建的對(duì)象,也不需要返回 對(duì)象了。
注意:創(chuàng)建對(duì)象也需要使用?new?關(guān)鍵字,如上圖,通過(guò)這種方法就既可以創(chuàng)建大量同類(lèi)型的對(duì)象,也可以判斷所屬類(lèi)型,非常方便。
這個(gè)?new 創(chuàng)建對(duì)象的過(guò)程為:
在內(nèi)存中先創(chuàng)建一個(gè)空的對(duì)象
讓構(gòu)造函數(shù)的 this 指向剛剛創(chuàng)建的對(duì)象
執(zhí)行構(gòu)造函數(shù)內(nèi)部的屬性和方法定義
返回當(dāng)前對(duì)象
3.2 對(duì)象屬性和方法的相關(guān)操作訪問(wèn)屬性語(yǔ)法為對(duì)象.屬性,還可以?對(duì)象["屬性名"]?這樣, 當(dāng)然也可以通過(guò)這兩個(gè)來(lái)修改對(duì)象屬性的值
當(dāng)然,當(dāng)對(duì)一個(gè)不存在的屬性訪問(wèn)的時(shí)候就會(huì)返回 undefined,若是修改一個(gè)不存在的屬性就是向該對(duì)象動(dòng)態(tài)增加一個(gè)新的屬性。
這兩種方法推薦第二種,因?yàn)橛袝r(shí)我們得到的屬性是一個(gè)變量名,并不知道具體的名字,這時(shí)候就只能使用第二種方法
訪問(wèn)方法直接使用?對(duì)象.函數(shù)名()?即可
遍歷對(duì)象成員
可以使用 for...in... 語(yǔ)句
刪除對(duì)象成員
使用?delete?關(guān)鍵字
3.3 簡(jiǎn)單數(shù)據(jù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型的區(qū)別基本類(lèi)型又叫做值類(lèi)型,復(fù)雜類(lèi)型又叫做引用類(lèi)型
值類(lèi)型:簡(jiǎn)單數(shù)據(jù)類(lèi)型,基本數(shù)據(jù)類(lèi)型,在存儲(chǔ)時(shí),變量中存儲(chǔ)的是值本身,因此叫做值類(lèi)型。
引用類(lèi)型:復(fù)雜數(shù)據(jù)類(lèi)型,在存儲(chǔ)時(shí),變量中存儲(chǔ)的僅僅是地址(引用),因此叫做引用數(shù)據(jù)類(lèi)型。
終于寫(xiě)完了,下一篇常用內(nèi)置對(duì)象走起。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/101687.html
摘要:為數(shù)值固定的表示法,用來(lái)表示整數(shù)和浮點(diǎn)數(shù)的。無(wú)論你寫(xiě)何種進(jìn)制,它的存儲(chǔ)還是以二進(jìn)制來(lái)存儲(chǔ)的,所以這樣就弄成了浮點(diǎn)數(shù)的存儲(chǔ)精確度,浮點(diǎn)數(shù)只能精確到位小數(shù)。關(guān)系運(yùn)算符關(guān)系運(yùn)算符有和。賦值運(yùn)算符賦值運(yùn)算符有六個(gè)。 現(xiàn)在的爬蟲(chóng)越來(lái)越難了,不再和之前的那樣,隨便抓個(gè)包就可以找到相關(guān)的 url ,然后 post 一下或者 get 一下數(shù)據(jù)就出來(lái)了。還有一個(gè)可能就是可能你以前用來(lái)學(xué)習(xí)的爬蟲(chóng)網(wǎng)站太簡(jiǎn)單...
摘要:未授權(quán)的爬蟲(chóng)抓取程序是危害原創(chuàng)內(nèi)容生態(tài)的一大元兇,因此要保護(hù)網(wǎng)站的內(nèi)容,首先就要考慮如何反爬蟲(chóng)。反爬蟲(chóng)的銀彈目前的反抓取機(jī)器人檢查手段,最可靠的還是驗(yàn)證碼技術(shù)。機(jī)器人協(xié)議除此之外,在爬蟲(chóng)抓取技術(shù)領(lǐng)域還有一個(gè)白道的手段,叫做協(xié)議。 本文首發(fā)于我的個(gè)人博客,同步發(fā)布于SegmentFault專(zhuān)欄,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處,商業(yè)轉(zhuǎn)載請(qǐng)閱讀原文鏈接里的法律聲明。 web是一個(gè)開(kāi)放的平臺(tái),這也奠定了...
摘要:本文是面向前端小白的,大手子可以跳過(guò),寫(xiě)的不好之處多多分鐘搞定常用基礎(chǔ)知識(shí)前端掘金基礎(chǔ)智商劃重點(diǎn)在實(shí)際開(kāi)發(fā)中,已經(jīng)非常普及了。 JavaScript字符串所有API全解密 - 掘金關(guān)于 我的博客:louis blog SF專(zhuān)欄:路易斯前端深度課 原文鏈接:JavaScript字符串所有API全解密 本文近 6k 字,讀完需 10 分鐘。 字符串作為基本的信息交流的橋梁,幾乎被所有的編程...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:入門(mén),第一個(gè)這是一門(mén)很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類(lèi)工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
閱讀 1453·2021-11-15 18:11
閱讀 2579·2021-08-19 10:56
閱讀 733·2021-08-09 13:42
閱讀 885·2019-08-30 15:53
閱讀 2141·2019-08-30 10:55
閱讀 3217·2019-08-29 17:18
閱讀 1509·2019-08-29 13:45
閱讀 619·2019-08-29 13:15