一、typeof
1.typeof的意義及作用:
我們知道ECMAScript中有5種簡單(基本)資料型別:Undefined、Null、Boolean、Number、String,以及一種引用資料型別Object。typeof的作用正式用於判斷運算元的資料型別的。所有的返回值為以上六種資料型別之一。
2.typeof操作符有下面兩種用法:
typeof 運算元
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