梳理的內(nèi)容以《JavaScript權(quán)威指南》這本書中的內(nèi)容為主,因此接下去跟JavaScript語法相關(guān)的系列文章基本只介紹ES5標(biāo)準(zhǔn)規(guī)范的內(nèi)容、ES6等這系列梳理完再單獨(dú)來講講。
正文-相關(guān)術(shù)語
對(duì)于從Java或C++轉(zhuǎn)過來的開發(fā)人員來說JavaScript會(huì)有點(diǎn)讓人困惑,因?yàn)樗慷际莿?dòng)態(tài)的,都是運(yùn)行時(shí),而且不存在類機(jī)制。所有的都是實(shí)例對(duì)象。所以,學(xué)習(xí)一些JavaScript的語言特性時(shí),最好不要試圖從Java中尋找相關(guān)概念硬套過來,類比可以。
接下去一系列關(guān)于JavaScript語法的文章中,將會(huì)出現(xiàn)很多在Java里出現(xiàn)或者沒出現(xiàn)過的專業(yè)術(shù)語,所以第一篇就先來羅列一下,每個(gè)術(shù)語先給一定的解釋。
有的理解不了沒關(guān)系,等這系列文章看完,再回過頭來看這一張基本也都能理解了。先羅列出來,至少有個(gè)印象,不至于到時(shí)看到一臉懵逼。
直接量
可以直接使用的數(shù)據(jù)值,即在程序中直接出現(xiàn)的數(shù)據(jù)值,如:
"hello world"
123
{name:dasu}
[]
...
等等這些直接出現(xiàn)可直接使用的數(shù)據(jù)值稱為直接量,不同數(shù)據(jù)類型有不同的叫法,常見的有:數(shù)字直接量、字符串直接量、正則表達(dá)式直接量、對(duì)象直接量、數(shù)組直接量等。
字面量
跟直接量沒什么區(qū)別,都是同一個(gè)單詞literals的不同翻譯而已,所以直接量也就是字面量,字面量就是直接量,不同書可能用的不同翻譯而已。
原始值
原始類型的值稱為原始值,原始值是不可變的。在JavaScript中,有兩種數(shù)據(jù)類型:原始類型和對(duì)象類型。
原始類型包括:數(shù)字(Number)、字符串(String)、布爾(Boolean)、null、undefined。
表達(dá)式&語句
表達(dá)式可以理解成方程式,用于計(jì)算某個(gè)結(jié)果值或某種行為的代碼可稱為表達(dá)式,通常它們并不會(huì)改變程序狀態(tài),也不會(huì)影響程序后續(xù)執(zhí)行流程,如算術(shù)表達(dá)式: x+1。
語句表示一個(gè)完整的行為,可以是多個(gè)表達(dá)式與關(guān)鍵字、運(yùn)算符等的組合。
函數(shù)&方法
function關(guān)鍵字聲明的稱為函數(shù),但將函數(shù)置于對(duì)象內(nèi)時(shí),此時(shí)稱它為對(duì)象的方法。
簡(jiǎn)單的理解,從不同的角度看待,如果是從函數(shù)本身,那么它就是個(gè)函數(shù),如果是從對(duì)象角度看待,那么稱某個(gè)函數(shù)是對(duì)象的方法,本質(zhì)上沒什么區(qū)別。但當(dāng)調(diào)用時(shí)會(huì)有所區(qū)別。
另外,函數(shù)本質(zhì)上也是一個(gè)對(duì)象。
構(gòu)造函數(shù)
JavaScript沒有類似于Java的class機(jī)制,一個(gè)函數(shù),當(dāng)和new關(guān)鍵字一起使用時(shí),此時(shí)稱這個(gè)函數(shù)為構(gòu)造函數(shù)。
也就是所有的函數(shù)都可以作為構(gòu)造函數(shù),當(dāng)它和new關(guān)鍵字一起使用時(shí),此時(shí)它的行為有區(qū)別于普通的函數(shù)調(diào)用。
全局對(duì)象
在前端里,當(dāng)js的宿主是瀏覽器時(shí),全局對(duì)象是window。全局對(duì)象有幾點(diǎn)特性:
js文件中不在函數(shù)內(nèi)聲明的所有變量和函數(shù)都是作為全局對(duì)象的屬性存在。
全局對(duì)象的屬性使用時(shí),可以直接通過屬性名訪問,不必添加前綴,也就是不必像window.name這么使用。
js文件中,函數(shù)外出現(xiàn)的this都指向全局對(duì)象window。
全局屬性
全局對(duì)象的屬性就稱全局屬性,但這里的全局屬性,更多的是在表示這種場(chǎng)景下為全局對(duì)象創(chuàng)建的屬性:
當(dāng)我們?cè)诤瘮?shù)外部直接對(duì)一個(gè)不存在的變量賦值操作時(shí),此時(shí)等價(jià)于執(zhí)行this.weixin = dasuAndroidTv,而this指向全局對(duì)象,所以會(huì)自動(dòng)為全局對(duì)象添加一個(gè)屬性,屬性名為weixin。
所以,有時(shí)候,全局屬性是特指這種場(chǎng)景下為全局對(duì)象創(chuàng)建的屬性。之所以會(huì)用全局屬性來稱呼這種場(chǎng)景,是為了跟下面的全局變量和全局函數(shù)區(qū)分開。
全局變量
像這種不在函數(shù)內(nèi)聲明的變量,稱為全局變量。雖然,它們最終也都是作為全局對(duì)象window的屬性而存在,但由于這種方式為window創(chuàng)建的屬性和上述介紹的不加var關(guān)鍵字為全局對(duì)象添加屬性的方式有本質(zhì)上的區(qū)別。
所以,為了和上述介紹的全局屬性概念區(qū)別開來,通常稱這種通過var為全局對(duì)象創(chuàng)建的屬性為全局變量。
既然全局對(duì)象的屬性在任何地方都可以不加前綴的直接訪問使用,所以全局變量在任何地方都可以被使用。
對(duì)于上述介紹的那種直接對(duì)不存在的屬性進(jìn)行賦值操作行為而創(chuàng)建的全局屬性,是可通過delete動(dòng)態(tài)刪除的;
而通過var或function這種聲明全局變量的方式為全局對(duì)象創(chuàng)建的屬性,是不可通過delete刪除的。
全局函數(shù)
像這種不在函數(shù)內(nèi)聲明的函數(shù),稱為全局函數(shù)。它跟全局變量的特性、用意一模一樣,區(qū)別只在于一個(gè)是變量、一個(gè)是函數(shù)而言。
包裝對(duì)象
原始類型所對(duì)應(yīng)的對(duì)象類型,類似于Java中的包裝類。
因?yàn)樵碱愋筒皇菍?duì)象,不可操作方法和屬性,但可將其轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象類型,此時(shí)稱為包裝對(duì)象,即可像操作對(duì)象一樣操作這些轉(zhuǎn)成包裝對(duì)象的原始類型數(shù)據(jù)。
包裝對(duì)象有:Number, Boolean, String
原型
由于在JavaScript中,除了原始類型,其余的皆為對(duì)象,所以它的繼承雙方只能都是對(duì)象,也就是說,對(duì)象也是繼承自對(duì)象的,那么作為父類角色,作為被繼承的那個(gè)對(duì)象,此時(shí)稱它為原型。
所以,才說JavaScript是基于原型的繼承語言。
原型就是類似于Java中父類的概念。
原型鏈
既然涉及繼承,那么自然就有繼承結(jié)構(gòu),這個(gè)結(jié)構(gòu)在JavaScript中就稱為原型鏈。
比如對(duì)象a繼承自對(duì)象b,對(duì)象b繼承自對(duì)象c,那么a的原型鏈就表示為:a -> b -> c(省略掉內(nèi)置的繼承關(guān)系)。
原型鏈用于當(dāng)操作對(duì)象某個(gè)屬性時(shí),尋找該屬性的來源。
作用區(qū)域
在 JavaScript 中,允許在函數(shù)內(nèi)部繼續(xù)定義函數(shù),所以函數(shù)可以存在很深的嵌套層次,這里的嵌套層次不是指調(diào)用的嵌套,而是指函數(shù)聲明的嵌套,A 函數(shù)在 B 函數(shù)中定義,作為 B 函數(shù)的局部變量存在這種。
而內(nèi)部函數(shù)是可以訪問外部函數(shù)內(nèi)的變量的,也可以訪問全局的變量,那么當(dāng)內(nèi)部函數(shù)使用了某個(gè)外部變量,就會(huì)借助作用域鏈,沿著作用域鏈中尋找這個(gè)外部變量究竟是外部函數(shù)內(nèi)的變量,還是全局變量。
從原理上解釋,每個(gè)函數(shù)調(diào)用時(shí),都會(huì)創(chuàng)建一個(gè)函數(shù)執(zhí)行上下文,執(zhí)行上下文中存儲(chǔ)著當(dāng)前上下文中的所有變量,作用域鏈,就是將具有嵌套層次的函數(shù)的上下文中的變量串接起來的存在。
還是要反復(fù)強(qiáng)調(diào),上面的嵌套層次指的不是函數(shù)調(diào)用時(shí)的嵌套層次,而是函數(shù)定義時(shí)的嵌套層次。可以將這里有嵌套層次關(guān)系的函數(shù)理解成 Java 中的內(nèi)部類。
本系列文章內(nèi)容全部梳理自以下幾個(gè)來源:
《JavaScript權(quán)威指南》
MDN web docs
Github:smyhvae/web
Github:goddyZhao/Translation/JavaScript
本文來源于網(wǎng)絡(luò),版權(quán)歸原作者所有(已有修改整合),如有侵權(quán)請(qǐng)聯(lián)系我們,即刻處理。謝謝!