typeof 與instanceof

//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是不是數組.
*/
相關文章
相關標籤/搜索