「一切都是對象」這句話的重點在於如何去理解「對象」這個概念。javascript
——固然,也不是全部的都是對象,值類型就不是對象。html
首先我們仍是先看看javascript中一個經常使用的運算符——typeof。typeof應該算是我們的老朋友,還有誰沒用過它?前端
typeof函數輸出的一共有幾種類型,在此列出:java
function show(x) { console.log(typeof x); // undefined console.log(typeof 10); // number console.log(typeof 'abc'); // string console.log(typeof true); // boolean console.log(typeof function () {}); //function console.log(typeof [1, 'a', true]); //object console.log(typeof { a: 10, b: 20 }); //object console.log(typeof null); //object console.log(typeof new Number(10)); //object } show();
以上代碼列出了typeof輸出的集中類型標識,其中上面的四種(undefined, number, string, boolean)屬於簡單的值類型,不是對象。剩下的幾種狀況——函數、數組、對象、null、new Number(10)都是對象。他們都是引用類型。web
判斷一個變量是否是對象很是簡單。值類型的類型判斷用typeof,引用類型的類型判斷用instanceof。面試
var fn = function () { }; console.log(fn instanceof Object); // true
好了,上面說了半天對象,各位可能也常常在工做中應對對象,在生活中還得應對活生生的對象。有些個心理不正常或者愛開玩笑的單身人士,還對於系統提示的「找不到對象」耿耿於懷。那麼在javascript中的對象,到底該如何定義呢?json
對象——若干屬性的集合。數組
java或者C#中的對象都是new一個class出來的,並且裏面有字段、屬性、方法,規定的很是嚴格。可是javascript就比較隨意了——數組是對象,函數是對象,對象仍是對象。對象裏面的一切都是屬性,只有屬性,沒有方法。那麼這樣方法如何表示呢?——方法也是一種屬性。由於它的屬性表示爲鍵值對的形式。閉包
並且,更加好玩的事,javascript中的對象能夠任意的擴展屬性,沒有class的約束。這個你們應該都知道,就再也不強調了。app
先說個最多見的例子:
以上代碼中,obj是一個自定義的對象,其中a、b、c就是它的屬性,並且在c的屬性值仍是一個對象,它又有name、year兩個屬性。
這個可能比較好理解,那麼函數和數組也能夠這樣定義屬性嗎?——固然不行,可是它能夠用另外一種形式,總之函數/數組之流,只要是對象,它就是屬性的集合。
以函數爲例子:
var fn = function () { alert(100); }; fn.a = 10; fn.b = function () { alert(123); }; fn.c = { name: "王福朋", year: 1988 };
上段代碼中,函數就做爲對象被賦值了a、b、c三個屬性——很明顯,這就是屬性的集合嗎。
你問:這個有用嗎?
回答:能夠看看jQuery源碼!
在jQuery源碼中,「jQuery」或者「$」,這個變量實際上是一個函數,不信你能夠叫我們的老朋友typeof驗證一下。
console.log(typeof $); // function console.log($.trim(" ABC "));
驗明正身!的確是個函數。那麼我們經常使用的 $.trim() 也是個函數,常常用,就不用驗了吧!
很明顯,這就是在$或者jQuery函數上加了一個trim屬性,屬性值是函數,做用是截取先後空格。
javascript與java/C#相比,首先最須要解釋的就是弱類型,由於弱類型是最基本的用法,並且最經常使用,就不打算作一節來說。
其次要解釋的就是本文的內容——一切(引用類型)都是對象,對象是屬性的集合。最須要了解的就是對象的概念,和java/C#徹底不同。因此,切記切記!
最後,有個疑問。在typeof的輸出類型中,function和object都是對象,爲什麼卻要輸出兩種答案呢?都叫作object不行嗎?——固然不行。
具體緣由,且聽下回分解!
---------------------------------------------------------------------------
本文已更新到《深刻理解javascript原型和閉包》的目錄,更多內容可參見《深刻理解javascript原型和閉包》。
另外,歡迎關注個人微博。
學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀》