//typeof操做符是用來檢測給定的變量的數據類型 //好比: var message="hello world"; alert(typeof(message)) // "string" //typeof會返回下列字符串 /* "undefined" --若是這個值未定義 "boolean" --若是這個值是布爾類型 "string" --若是這個值是字符串類型 "number" --若是這個值是數值 "object" --若是這個值是對象或null "function" --若是這個值是函數 */ //instanceof運算符能夠判斷某個構造函數的prototype屬性是否存在另一個要檢測的原型鏈上 /* 語法: object instanceof constructor 參數: object 要檢測的對象 constructor 某個構造函數 描述: function C(){} function D(){} var o=new C(); o instanceof C; //true,由於 Object.getPrototypeOf(o)===C.prototype o instanceof D; //false,由於D.protorype不在o的原型鏈上 o instanceof Object;//true,由於Object.prototype.isPrototypeOf(o)返回true C.prototype instanceof Object;//true 同上 C.prototype={}; var o2=new C(); o2 instanceof C;//true o instanceof C;//false ,由於C.prototype指向了一個空對象,這個空對象不在o的原型鏈上 D.prototype=new C(); var o3=new D(); o3 instanceof D;//true o3 instanceof C;//true 須要注意的是,若是表達式obj instanceof Foo返回true,則並不意味着該表達式會永遠返回ture, 由於Foo.prototype屬性的值有可能會改變,改變以後的值頗有可能不存在於obj的原型鏈上,這時原表達式的值就會成爲false. 另一種狀況下原表達式的值也會改變,就是改變對象obj的原型鏈的狀況, 雖然在目前的ES規範中,咱們只能讀取對象的原型而不能改變它,但藉助於非標準的__proto__魔法屬性, 是能夠實現的.好比執行obj.__proto__ = {}以後,obj instanceof Foo就會返回false了. instanceof和多全局對象(多個frame或多個window之間的交互) 在瀏覽器中,咱們的腳本可能須要在多個窗口之間進行交互.多個窗口意味着多個全局環境,不一樣的全局環境擁有不一樣的全局對象,從而擁有不一樣的內置類型構造函數. 這可能會引起一些問題.好比,表達式[] instanceof window.frames[0]. Array會返回false,由於 Array.prototype !== window.frames[0].Array.prototype, 所以你必須使用 Array.isArray(myObj)或者 Object.prototype.toString.call(myObj) === "[object Array]"來判斷myObj是不是數組. */