typeof、instanceof與isPrototypeOf()的差異與聯絡

白牙青森發表於2014-04-15

一、typeof

1.typeof的意義及作用:

  我們知道ECMAScript中有5種簡單(基本)資料型別:Undefined、Null、Boolean、Number、String,以及一種引用資料型別Object。typeof的作用正式用於判斷運算元的資料型別的。所有的返回值為以上六種資料型別之一。

2.typeof操作符有下面兩種用法:

  1. typeof 運算元
  2. typeof (運算元)

3. typeof中的陷阱

  • typeof null 會返回 “object”,因為特殊值null被認為是一個空的物件引用。
  • 正規表示式在不同瀏覽器中返回值不同,具體如下
1 typeof /s/ === 'function'; // Chrome 1-7... // 不符合 ECMAScript 5.1
2 typeof /s/ === 'object'; // Firefox 5+ 、Chrome 7+...    // 符合 ECMAScript 5.1

4. 測試例子

 1 // Numbers
 2 typeof 37 === 'number';
 3 typeof 3.14 === 'number';
 4 typeof Math.LN2 === 'number';
 5 typeof Infinity === 'number';
 6 typeof NaN === 'number'; // 儘管NaN是"Not-A-Number"的縮寫,意思是"不是一個數字"
 7 typeof Number(1) === 'number'; // 不要這樣使用!
 8 
 9 // Strings
10 typeof "" === 'string';
11 typeof "bla" === 'string';
12 typeof (typeof 1) === 'string'; // typeof返回的肯定是一個字串
13 typeof String("abc") === 'string'; // 不要這樣使用!
14 
15 // Booleans
16 typeof true === 'boolean';
17 typeof false === 'boolean';
18 typeof Boolean(true) === 'boolean'; // 不要這樣使用!
19 
20 // Undefined
21 typeof undefined === 'undefined';
22 typeof blabla === 'undefined'; // 一個未定義的變數,或者一個定義了卻未賦初值的變數
23 
24 // Objects
25 typeof {a:1} === 'object';
26 typeof [1, 2, 4] === 'object'; // 使用Array.isArray或者Object.prototype.toString.call方法可以分辨出一個陣列和真實的物件
27 typeof new Date() === 'object';
28 
29 typeof new Boolean(true) === 'object' // 令人困惑.不要這樣使用
30 typeof new Number(1) === 'object' // 令人困惑.不要這樣使用
31 typeof new String("abc") === 'object';  // 令人困惑.不要這樣使用
32 // Functions
33 typeof function(){} === 'function';
34 typeof Math.sin === 'function';

二、instanceof

1.typeof的意義及作用:

  instanceof運算子可以用來判斷某個建構函式的prototype屬性是否存在另外一個要檢測物件的原型鏈上.關於原型鏈的知識在new和instanceof的內部機制JavaScript中__proto__與prototype的關係中已做了講解。

2.instanceof中的陷阱:

  在瀏覽器中,我們的指令碼可能需要在多個視窗之間進行互動.多個視窗意味著多個全域性環境,不同的全域性環境擁有不同的全域性物件,從而擁有不同的內建型別建構函式.這可能會引發一些問題.比如,表示式[] instanceof window.frames[0].Array會返回false,因為 Array.prototype !==window.frames[0].Array.prototype,因此你必須使用 Array.isArray(myObj)或者 Object.prototype.toString.call(myObj) === "[object Array]"來判斷myObj是否是陣列.

三、isPrototypeOf

1.typeof的意義及作用:

  檢測一個物件是否存在於另一個物件的原型鏈中.其作用與instanceof有點相似,但使用方法是不一樣的。

2.用法與例子:

 1 function Fee() {
 2   // . . .
 3 }
 4 
 5 function Fi() {
 6   // . . .
 7 }
 8 Fi.prototype = new Fee();
 9 
10 function Fo() {
11   // . . .
12 }
13 Fo.prototype = new Fi();
14 
15 function Fum() {
16   // . . .
17 }
18 Fum.prototype = new Fo();
19 
20 var fum = new Fum();
21 . . .
22 
23 Fi.prototype.isPrototypeOf(fum); //true
24 fum instanceof Fi; // true

 

相關文章