在 JavaScript 中,判斷一個變量的類型嚐嚐會用 typeof 運算符,在使用 typeof 運算符時採用引用類型存儲值會出現一個問題,不管引用的是什麼類型的對象,它都返回 "object"。ECMAScript 引入了另外一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符類似,用於識別正在處理的對象的類型。與 typeof 方法不一樣的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。例如:html
1
2
|
var oStringObject = new String("hello world");
console.log(oStringObject instanceof String); // 輸出 "true"
|
這段代碼問的是「變量 oStringObject 是否爲 String 對象的實例?」oStringObject 的確是 String 對象的實例,所以結果是"true"。儘管不像 typeof 方法那樣靈活,可是在 typeof 方法返回 "object" 的狀況下,instanceof 方法仍是頗有用的。spa
一般來說,使用 instanceof 就是判斷一個實例是否屬於某種類型。例如:prototype
1
2
3
4
|
// 判斷 foo 是不是 Foo 類的實例
function Foo(){}
var foo = new Foo();
console.log(foo instanceof Foo)//true
|
另外,更重的一點是 instanceof 能夠在繼承關係中用來判斷一個實例是否屬於它的父類型。例如:code
1
2
3
4
5
6
7
8
|
// 判斷 foo 是不是 Foo 類的實例 , 而且是不是其父類型的實例
function Aoo(){}
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型繼承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
|
上面的代碼中是判斷了一層繼承關係中的父類,在多層繼承關係中,instanceof 運算符一樣適用。htm
看了上面的代碼示例,是否是以爲 instanceof 操做符很簡單,下面來看點複雜的用法。對象
1
2
3
4
5
6
7
8
9
|
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true
console.log(Number instanceof Number);//false
console.log(String instanceof String);//false
console.log(Function instanceof Object);//true
console.log(Foo instanceof Function);//true
console.log(Foo instanceof Foo);//false
|
看了上面的代碼是否是又暈頭轉向了?爲何 Object 和 Function instanceof 本身等於 true,而其餘類 instanceof 本身卻又不等於 true 呢?如何解釋?要想從根本上了解 instanceof 的奧祕,須要從兩個方面着手:1,語言規範中是如何定義這個運算符的。2,JavaScript 原型繼承機制。繼承