JavaScript 原型總結二 一切皆對象之typeof

1.javascript中一個經常使用的運算符——typeof

「一切都是對象」這句話的重點在於如何去理解「對象」這個概念。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 原型總結三 函數和對象的關係>!能夠關注一下個人訂閱號,分享彼此

能夠關注一下個人訂閱號,分享彼此

相關文章
相關標籤/搜索