摘要:如圖反而,由于這些的都是繼承自,所以原型鏈拐向了。因此這樣一個實例,他順著原型鏈是找到了如圖選學內容如果我們刨根問底,去尋找和的根源的話,那這個問題又稍微有點復雜了。
基本類型
Number, Boolean, String, null, undefined
什么樣的變量是 undefined聲明了變量卻沒賦值
未聲明的變量
包裝類型其實js里面也有像java,c#里所謂的包裝類型
var a = 123 var b = a.toString()
請問a既然是一個簡單的基本類型,內存棧上的4個字節(jié)的數字類型,為什么有toString方法呢?
顯然,這里也發(fā)生了包裝,其過程大概是這樣的:
var tmp = new Number(a) var b = tmp.toString()引用類型
JS中一切皆對象,我們可以統(tǒng)稱為除了基本類型的這些其他元素,都叫做對象。因為他們都可以有自身的屬性、自身的方法。
不過,從面向對象的角度來看,我們還是應該像學習Java那樣,對js里的對象進行一下劃分。我對js里的類型劃分是這樣的定義的:
除了基本類型,都是引用類型。引用類型有內置的如Date,Array,Object等,也有自己創(chuàng)建的類型如Person, Dog等等。
然而,js又是一個偏函數式的語言,那么,在js里函數承擔什么角色呢。
它其實既能當做構造函數創(chuàng)建一個類的定義,如Dog
又能當做一個全局函數,來提供給別人使用。如parseInt。當然,全局其實也可以看做是window對象的一個方法:window.parseInt
函數又能當做一個對象的方法,像其他面向對象語言那樣,如arr.slice()
函數還能作為參數傳遞,像很多函數式語言一樣。如arr.map(function (item,index) {})
所以,JavaScript既能搞得來面向對象,又能充分發(fā)揮函數的靈活性,豈不美哉。
類型判斷typeof能夠返回的結果只有: "undefined", "bollean", "number", "string","object","function"
可見,包含了基本類型的所有類型,除了null,null這種基本類型會被判定為"object",而其他所有引用類型也會被判定為"object"或"function".
因此,使用typeof可以用來判定基本類型中的 stirng, number, boolean, undefined
而遇到引用類型,則需要用更嚴格的方法來判定:
instanceof 可以判定一個引用類型是否屬于某個類型。而所有引用類型其實都繼承自Object,所以任何引用類型instanceof Object都是true。
我的總結其實JavaScript中,就只有基本類型和其他類型。而其他類型都有一個公共的父類,叫做Function類型。哪怕Js中的Object,也是Function類型的一個實例。
Function類型的實例比較特殊,因為Function類型的實例還是一個Function,比如Object、Array、Date都是Function類型的實例。所以JS中,Function的實例,才相當于其他語言當中的類,class。
重點來了由于Array、Date,都是從Function繼承而來,所以他們都會繼承/享有Function.prototype上的東西。
而Array、Date的實例,都是從Array、Date繼承而來,因此實例會繼承Array或Date的prototype上的東西.
然而,實例卻跟Function沒有任何關系,因為js中繼承是依靠原型繼承的,Array.prototype跟Function扯不上關系,那Array的實例也跟Function沒有半毛錢關系。如圖:
反而, 由于Array、Date這些class的prototype都是繼承自Object,所以原型鏈拐向了Object。因此var arr = new Array()這樣一個實例,他順著原型鏈是找到了Object.prototype. 如圖:
選學內容如果我們刨根問底,去尋找Object和Function的根源的話,那這個問題又稍微有點復雜了。
我們知道Object類型,是繼承自Function.prototype的, Array是繼承自Object.prototype。而Object.prototype繼承自誰呢?
答案是Object.prototype是繼承自null
而Function繼承自自己的Function.prototype, 即:
Function.__proto__ == Function.prototype
而 Function.prototype 卻不是一個對象,而是一個函數, 但奇特的是Function.prototype這個函數并沒有prototype屬性,只知道該函數繼承自Object.prototype (所以這個函數怎么造出來的呢?竟然繼承自一個對象,看來是這里揭示了為何js里一切皆對象把,連Function往上找源頭都最終找到它繼承自Object.prototype)
所以,最終的結果如圖所示:
再上一張比較全的圖:
這張圖上少畫了一筆,最上方的空函數,其__proto__也應該指向Object.prototype,。
所以,js中所有類型的根源,竟然是Object.prototype頂上的那個null....
而typeof null 又是 "object",所以在js當中,一切皆對象!!!
沒了本文同步發(fā)表在 知乎專欄 青檬前端 和 我的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94934.html
摘要:于是就有了即學即用這個系列的文章。系列第一篇,就從純函數開始,由于我是前端方向,所以就從語言中的純函數說起。并行代碼純函數是健壯的,改變執(zhí)行次序不會對系統(tǒng)造成影響,因此純函數的操作可以并行執(zhí)行。 最近一直在思考如何通過文章或者培訓快速提升團隊的編碼能力,總結下來其實技術的學習分為兩類:一種是系統(tǒng)性的學習,比如學習一門語言,學習一個開發(fā)框架,這更需要自己從入門到進階再到實踐一步步系統(tǒng)性的...
摘要:偽元素選擇器和偽類一樣,偽元素也用于向選擇器添加特殊的效果。另外,偽元素前的是偽元素選擇器的標識,不能省略。偽元素的使用在后面添加內容并設置該內容的背景顏色這是使用偽元素添加的內容設置添加的內容偽元素選擇器可以是任意類型的選擇器。 showImg(https://segmentfault.com/img/bVbkWXI?w=900&h=383); 在上一篇文章中,我們講到基礎選擇器中的...
閱讀 3209·2021-11-23 09:51
閱讀 3669·2021-09-22 15:35
閱讀 3646·2021-09-22 10:02
閱讀 2956·2021-08-30 09:49
閱讀 509·2021-08-05 10:01
閱讀 3376·2019-08-30 15:54
閱讀 1633·2019-08-30 15:53
閱讀 3558·2019-08-29 16:27