亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript即學(xué)即用教程[1]-類(lèi)型系統(tǒng)

toddmark / 625人閱讀

摘要:如圖反而,由于這些的都是繼承自,所以原型鏈拐向了。因此這樣一個(gè)實(shí)例,他順著原型鏈?zhǔn)钦业搅巳鐖D選學(xué)內(nèi)容如果我們刨根問(wèn)底,去尋找和的根源的話(huà),那這個(gè)問(wèn)題又稍微有點(diǎn)復(fù)雜了。

基本類(lèi)型

Number, Boolean, String, null, undefined

什么樣的變量是 undefined

聲明了變量卻沒(méi)賦值

未聲明的變量

包裝類(lèi)型

其實(shí)js里面也有像java,c#里所謂的包裝類(lèi)型

var a = 123
var b = a.toString()

請(qǐng)問(wèn)a既然是一個(gè)簡(jiǎn)單的基本類(lèi)型,內(nèi)存棧上的4個(gè)字節(jié)的數(shù)字類(lèi)型,為什么有toString方法呢?
顯然,這里也發(fā)生了包裝,其過(guò)程大概是這樣的:

var tmp = new Number(a)
var b = tmp.toString()
引用類(lèi)型

JS中一切皆對(duì)象,我們可以統(tǒng)稱(chēng)為除了基本類(lèi)型的這些其他元素,都叫做對(duì)象。因?yàn)樗麄兌伎梢杂凶陨淼膶傩?、自身的方法?/p>

不過(guò),從面向?qū)ο蟮慕嵌葋?lái)看,我們還是應(yīng)該像學(xué)習(xí)Java那樣,對(duì)js里的對(duì)象進(jìn)行一下劃分。我對(duì)js里的類(lèi)型劃分是這樣的定義的:

除了基本類(lèi)型,都是引用類(lèi)型。引用類(lèi)型有內(nèi)置的如Date,Array,Object等,也有自己創(chuàng)建的類(lèi)型如Person, Dog等等。

然而,js又是一個(gè)偏函數(shù)式的語(yǔ)言,那么,在js里函數(shù)承擔(dān)什么角色呢。

它其實(shí)既能當(dāng)做構(gòu)造函數(shù)創(chuàng)建一個(gè)類(lèi)的定義,如Dog

又能當(dāng)做一個(gè)全局函數(shù),來(lái)提供給別人使用。如parseInt。當(dāng)然,全局其實(shí)也可以看做是window對(duì)象的一個(gè)方法:window.parseInt

函數(shù)又能當(dāng)做一個(gè)對(duì)象的方法,像其他面向?qū)ο笳Z(yǔ)言那樣,如arr.slice()

函數(shù)還能作為參數(shù)傳遞,像很多函數(shù)式語(yǔ)言一樣。如arr.map(function (item,index) {})

所以,JavaScript既能搞得來(lái)面向?qū)ο?,又能充分發(fā)揮函數(shù)的靈活性,豈不美哉。

類(lèi)型判斷

typeof能夠返回的結(jié)果只有: "undefined", "bollean", "number", "string","object","function"
可見(jiàn),包含了基本類(lèi)型的所有類(lèi)型,除了null,null這種基本類(lèi)型會(huì)被判定為"object",而其他所有引用類(lèi)型也會(huì)被判定為"object"或"function".

因此,使用typeof可以用來(lái)判定基本類(lèi)型中的 stirng, number, boolean, undefined

而遇到引用類(lèi)型,則需要用更嚴(yán)格的方法來(lái)判定:

instanceof 可以判定一個(gè)引用類(lèi)型是否屬于某個(gè)類(lèi)型。而所有引用類(lèi)型其實(shí)都繼承自O(shè)bject,所以任何引用類(lèi)型instanceof Object都是true。

我的總結(jié)

其實(shí)JavaScript中,就只有基本類(lèi)型和其他類(lèi)型。而其他類(lèi)型都有一個(gè)公共的父類(lèi),叫做Function類(lèi)型。哪怕Js中的Object,也是Function類(lèi)型的一個(gè)實(shí)例。

Function類(lèi)型的實(shí)例比較特殊,因?yàn)镕unction類(lèi)型的實(shí)例還是一個(gè)Function,比如Object、Array、Date都是Function類(lèi)型的實(shí)例。所以JS中,F(xiàn)unction的實(shí)例,才相當(dāng)于其他語(yǔ)言當(dāng)中的類(lèi),class。

重點(diǎn)來(lái)了

由于Array、Date,都是從Function繼承而來(lái),所以他們都會(huì)繼承/享有Function.prototype上的東西。
而Array、Date的實(shí)例,都是從Array、Date繼承而來(lái),因此實(shí)例會(huì)繼承Array或Date的prototype上的東西.
然而,實(shí)例卻跟Function沒(méi)有任何關(guān)系,因?yàn)閖s中繼承是依靠原型繼承的,Array.prototype跟Function扯不上關(guān)系,那Array的實(shí)例也跟Function沒(méi)有半毛錢(qián)關(guān)系。如圖:

反而, 由于Array、Date這些class的prototype都是繼承自O(shè)bject,所以原型鏈拐向了Object。因此var arr = new Array()這樣一個(gè)實(shí)例,他順著原型鏈?zhǔn)钦业搅薕bject.prototype. 如圖:

選學(xué)內(nèi)容

如果我們刨根問(wèn)底,去尋找Object和Function的根源的話(huà),那這個(gè)問(wèn)題又稍微有點(diǎn)復(fù)雜了。

我們知道Object類(lèi)型,是繼承自Function.prototype的, Array是繼承自O(shè)bject.prototype。而Object.prototype繼承自誰(shuí)呢?

答案是Object.prototype是繼承自null

而Function繼承自自己的Function.prototype, 即:
Function.__proto__ == Function.prototype

Function.prototype 卻不是一個(gè)對(duì)象,而是一個(gè)函數(shù), 但奇特的是Function.prototype這個(gè)函數(shù)并沒(méi)有prototype屬性,只知道該函數(shù)繼承自O(shè)bject.prototype (所以這個(gè)函數(shù)怎么造出來(lái)的呢?竟然繼承自一個(gè)對(duì)象,看來(lái)是這里揭示了為何js里一切皆對(duì)象把,連Function往上找源頭都最終找到它繼承自O(shè)bject.prototype)

所以,最終的結(jié)果如圖所示:

再上一張比較全的圖:

這張圖上少畫(huà)了一筆,最上方的空函數(shù),其__proto__也應(yīng)該指向Object.prototype,。

所以,js中所有類(lèi)型的根源,竟然是Object.prototype頂上的那個(gè)null....

而typeof null 又是 "object",所以在js當(dāng)中,一切皆對(duì)象?。?!

沒(méi)了

本文同步發(fā)表在 知乎專(zhuān)欄 青檬前端 和 我的博客

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/94934.html

相關(guān)文章

  • 即學(xué)即用系列一:純函數(shù)

    摘要:于是就有了即學(xué)即用這個(gè)系列的文章。系列第一篇,就從純函數(shù)開(kāi)始,由于我是前端方向,所以就從語(yǔ)言中的純函數(shù)說(shuō)起。并行代碼純函數(shù)是健壯的,改變執(zhí)行次序不會(huì)對(duì)系統(tǒng)造成影響,因此純函數(shù)的操作可以并行執(zhí)行。 最近一直在思考如何通過(guò)文章或者培訓(xùn)快速提升團(tuán)隊(duì)的編碼能力,總結(jié)下來(lái)其實(shí)技術(shù)的學(xué)習(xí)分為兩類(lèi):一種是系統(tǒng)性的學(xué)習(xí),比如學(xué)習(xí)一門(mén)語(yǔ)言,學(xué)習(xí)一個(gè)開(kāi)發(fā)框架,這更需要自己從入門(mén)到進(jìn)階再到實(shí)踐一步步系統(tǒng)性的...

    Hanks10100 評(píng)論0 收藏0
  • 即學(xué)即用,輕松搞定這些選擇器?。ㄏ拢?/b>

    摘要:偽元素選擇器和偽類(lèi)一樣,偽元素也用于向選擇器添加特殊的效果。另外,偽元素前的是偽元素選擇器的標(biāo)識(shí),不能省略。偽元素的使用在后面添加內(nèi)容并設(shè)置該內(nèi)容的背景顏色這是使用偽元素添加的內(nèi)容設(shè)置添加的內(nèi)容偽元素選擇器可以是任意類(lèi)型的選擇器。 showImg(https://segmentfault.com/img/bVbkWXI?w=900&h=383); 在上一篇文章中,我們講到基礎(chǔ)選擇器中的...

    caspar 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<