typeof:
使用typeof可以判斷除了null之外所有數(shù)據(jù)類型,但是
typeof null // 'object'
這是因?yàn)樵趈s最初版本中使用的32位系統(tǒng),出于性能考慮,000開頭表示變量斯够,但是null的所有位數(shù)全是0,所以被錯(cuò)誤的判斷為對(duì)象喧锦。使用Object.prototype.toString.call(xx)方法可以得正確的數(shù)據(jù)類型读规。
Object.prototype.toString.call(null) // [object null]
判斷已知對(duì)象類型的方法: instanceof
instanceof 是用來(lái)判斷 A 是否為 B 的實(shí)例,表達(dá)式為:A instanceof B裸违,如果 A 是 B 的實(shí)例掖桦,則返回 true,否則返回 false。 在這里需要特別注意的是:instanceof 檢測(cè)的是原型供汛,我們用一段偽代碼來(lái)模擬其內(nèi)部執(zhí)行過(guò)程:
instanceof (A,B) = {
var L = A.__proto__;
var R = B.prototype;
if(L === R) {
// A的內(nèi)部屬性 __proto__ 指向 B 的原型對(duì)象
return true;
}
return false;
}
從上述過(guò)程可以看出,當(dāng) A 的 proto 指向 B 的 prototype 時(shí)涌穆,就認(rèn)為 A 就是 B 的實(shí)例怔昨,我們?cè)賮?lái)看幾個(gè)例子:
[] instanceof Array; // true
{} instanceof Object;// true
new Date() instanceof Date;// true
function Person(){};
new Person() instanceof Person;
[] instanceof Object; // true
new Date() instanceof Object;// true
new Person instanceof Object;// true
從 instanceof 能夠判斷出 [ ].proto 指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype宿稀,最終 Object.prototype.proto 指向了null趁舀,標(biāo)志著原型鏈的結(jié)束。因此祝沸,[]矮烹、Array越庇、Object 就在內(nèi)部形成了一條原型鏈:
從原型鏈可以看出,[] 的 proto 直接指向Array.prototype奉狈,間接指向 Object.prototype卤唉,所以按照 instanceof 的判斷規(guī)則,[] 就是Object的實(shí)例仁期。依次類推桑驱,類似的 new Date()、new Person() 也會(huì)形成一條對(duì)應(yīng)的原型鏈 跛蛋。因此熬的,instanceof 只能用來(lái)判斷兩個(gè)對(duì)象是否屬于實(shí)例關(guān)系****, 而不能判斷一個(gè)對(duì)象實(shí)例具體屬于哪種類型赊级。
instanceof 操作符的問(wèn)題在于押框,它假定只有一個(gè)全局執(zhí)行環(huán)境。如果網(wǎng)頁(yè)中包含多個(gè)框架理逊,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境强戴,從而存在兩個(gè)以上不同版本的構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組挡鞍,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)骑歹。
constructor
[].constructor = Array
true.constructor = Boolean
注意:
null 和 undefined 是無(wú)效的對(duì)象,因此是不會(huì)有 constructor 存在的墨微,這兩種類型的數(shù)據(jù)需要通過(guò)其他方式來(lái)判斷道媚。
函數(shù)的 constructor 是不穩(wěn)定的,這個(gè)主要體現(xiàn)在自定義對(duì)象上翘县,當(dāng)開發(fā)者重寫 prototype 后最域,原有的 constructor 引用會(huì)丟失,constructor 會(huì)默認(rèn)為 Object锈麸。
Object.prototype.toString.call
toString() 是 Object 的原型方法镀脂,調(diào)用該方法,默認(rèn)返回當(dāng)前對(duì)象的 [[Class]] 忘伞。這是一個(gè)內(nèi)部屬性薄翅,其格式為 [object Xxx] ,其中 Xxx 就是對(duì)象的類型氓奈。