JavaScript即學即用教程[1]-類型系統

基本類型

Number, Boolean, String, null, undefinedjavascript

什麼樣的變量是 undefined

  1. 聲明瞭變量卻沒賦值
  2. 未聲明的變量

包裝類型

其實js裏面也有像java,c#裏所謂的包裝類型前端

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

請問a既然是一個簡單的基本類型,內存棧上的4個字節的數字類型,爲何有toString方法呢?
顯然,這裏也發生了包裝,其過程大概是這樣的:java

var tmp = new Number(a)
var b = tmp.toString()

引用類型

JS中一切皆對象,咱們能夠統稱爲除了基本類型的這些其餘元素,都叫作對象。由於他們均可以有自身的屬性、自身的方法。c#

不過,從面向對象的角度來看,咱們仍是應該像學習Java那樣,對js裏的對象進行一下劃分。我對js裏的類型劃分是這樣的定義的:函數

除了基本類型,都是引用類型。引用類型有內置的如Date,Array,Object等,也有本身建立的類型如Person, Dog等等。

然而,js又是一個偏函數式的語言,那麼,在js裏函數承擔什麼角色呢。學習

  1. 它其實既能當作構造函數建立一個類的定義,如Dog
  2. 又能當作一個全局函數,來提供給別人使用。如parseInt。固然,全局其實也能夠看作是window對象的一個方法:window.parseInt
  3. 函數又能當作一個對象的方法,像其餘面嚮對象語言那樣,如arr.slice()
  4. 函數還能做爲參數傳遞,像不少函數式語言同樣。如arr.map(function (item,index) {})

因此,JavaScript既能搞得來面向對象,又能充分發揮函數的靈活性,豈不美哉。ui

類型判斷

typeof可以返回的結果只有: 'undefined', 'bollean', 'number', 'string','object','function'
可見,包含了基本類型的全部類型,除了null,null這種基本類型會被斷定爲'object',而其餘全部引用類型也會被斷定爲'object'或'function'.spa

所以,使用typeof能夠用來斷定基本類型中的 stirng, number, boolean, undefinedprototype

而遇到引用類型,則須要用更嚴格的方法來斷定:code

  • 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當中,一切皆對象!!!

沒了

本文同步發表在 知乎專欄 青檬前端個人博客

相關文章
相關標籤/搜索