「一切都是對象」這句話的重點在於如何去理解「對象」這個概念。javascript
——固然,也不是全部的都是對象,值類型就不是對象。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)都是對象。他們都是引用類型。數組
判斷一個變量是否是對象很是簡單。值類型的類型判斷用typeof,引用類型的類型判斷用instanceof。(這個方法也能夠Object.prototype.toString.call("引用對象"))函數
var fn = function () { }; console.log(fn instanceof Object); // true
java或者C#中的對象都是new一個class出來的,並且裏面有字段、屬性、方法,規定的很是嚴格。可是javascript就比較隨意了——數組是對象,函數是對象,對象仍是對象。對象裏面的一切都是屬性,只有屬性,沒有方法。那麼這樣方法如何表示呢?——方法也是一種屬性。由於它的屬性表示爲鍵值對的形式。查看下圖this
以上代碼中,obj是一個自定義的對象,其中a、b、c就是它的屬性,並且在c的屬性值仍是一個對象,它又有name、year兩個屬性。spa
這個可能比較好理解,那麼函數和數組也能夠這樣定義屬性嗎?——固然不行,可是它能夠用另外一種形式,總之函數/數組之流,只要是對象,它就是屬性的集合。.net
var fn = function () { alert(100); }; fn.a = 10; fn.b = function () { alert(123); }; fn.c = { name: "張澤立", year: 0 }; //上段代碼中,函數就做爲對象被賦值了a、b、c三個屬性——很明顯,這就是屬性的集合嗎。你或許會問,這樣有用嗎? //能夠看看jQuery源碼 //在jQuery源碼中,「jQuery」或者「$」,這個變量實際上是一個函數,不信你能夠叫我們的老朋友typeof驗證一下。 console.log(typeof $); // function console.log($.trim(" ABC ")); //很明顯,這就是在$或者jQuery函數上加了一個trim屬性,屬性值是函數,做用是截取先後空格。
並且,更加好玩的事,javascript中的對象能夠任意的擴展屬性,沒有class的約束。這個你們應該都知道,就再也不強調了。prototype
javascript與java/C#相比,首先最須要解釋的就是弱類型,由於弱類型是最基本的用法,並且最經常使用,就不打算作一節來說。code
其次要解釋的就是本文的內容——一切(引用類型)都是對象,對象是屬性的集合。最須要了解的就是對象的概念,和java/C#徹底不同。因此,切記切記!對象
小code{探究js不一樣類型的祕密}
(function (root,factory) { if(typeof module ==='object' &&typeof module.exprots==='object'){ module.exprots=factory(); }else{ root.ZZL =root.$=factory(); } })(this,function () { var ZZL={ type:function (obj) { if(obj==null){ return obj +""; } return typeof obj==='object'||typeof obj==='function'?class2type[Object. prototype.toString.call(obj)] || 'object': typeof obj; }, //ES6語法 isFunction(obj) { return this.type(obj)==='function'; } }; var class2type ={}; //生成對象映射 "Boolean Number String Function Array Date RegExp Object Error Null Undefined".split(" ").map( function (item,index) { class2type["[object "+item+"]"]=item.toLowerCase(); } ); return ZZL; })
在typeof的輸出類型中,function和object都是對象
爲什麼卻要輸出兩種答案呢?都叫作object不行嗎?——固然不行。
具體緣由,且聽下回分解<JavaScript 原型總結三 函數和對象的關係>!能夠關注一下個人訂閱號,分享彼此