typeof
先來說說typeof吧。首先要注意的是,typeof方法傳回一個字串,來表示資料的型別。
typeof 是一個一元運算,放在一個運算數之前,運算數可以是任意型別。
它傳回值是一個字串,該字串說明運算數的類型。 typeof 一般只能回傳以下幾個結果:
number,boolean,string,function,object,undefined。我們可以使用typeof 來取得一個變數是否存在,如if(typeof a!="undefined"){alert("ok")},而不要去使用if(a) 因為如果a 不存在(未宣告)則會出錯,對於Array,Null 等特殊物件使用typeof 一律傳回object,這正是typeof 的限制。
語法講解
我們先看看各個資料型態對應typeof的值:
typeof 37 === 'number'; typeof 3.14 === 'number'; typeof Math.LN2 === 'number'; typeof Infinity === 'number'; typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写,意思是"不是一个数字" typeof Number(1) === 'number'; // 不要这样使用! // Strings typeof "" === 'string'; typeof "bla" === 'string'; typeof (typeof 1) === 'string'; // typeof返回的肯定是一个字符串 typeof String("abc") === 'string'; // 不要这样使用! // Booleans typeof true === 'boolean'; typeof false === 'boolean'; typeof Boolean(true) === 'boolean'; // 不要这样使用! // Symbols typeof Symbol() === 'symbol'; typeof Symbol('foo') === 'symbol'; typeof Symbol.iterator === 'symbol'; // Undefined typeof undefined === 'undefined'; typeof blabla === 'undefined'; // 一个未定义的变量,或者一个定义了却未赋初值的变量 // Objects typeof {a:1} === 'object'; // 使用Array.isArray或者Object.prototype.toString.call方法可以从基本的对象中区分出数组类型 typeof [1, 2, 4] === 'object'; typeof new Date() === 'object'; // 下面的容易令人迷惑,不要这样使用! typeof new Boolean(true) === 'object'; typeof new Number(1) ==== 'object'; typeof new String("abc") === 'object'; // 函数 typeof function(){} === 'function'; typeof Math.sin === 'function';
我們會發現一個問題,就是typeof來判斷資料型別其實並不準確。例如數組、正規、日期、物件的typeof回傳值都是object,這就會造成一些誤差。
所以在typeof判斷類型的基礎上,我們還需要利用Object.prototype.toString方法來進一步判斷資料型別。
我們來看看在相同資料型別的情況下,toString方法和typeof方法傳回值的差異:
資料 | toString | typeof |
---|---|---|
“foo” | String | “foo” |
new Number( 1.2) | Number | |
true | Boolean | |
new Boolean(true) | Boolean | object |
new Date() | Date | |
新數組(1, 2, 3) | Array | object |
/abc/g | RegExp | object |