1.資料型別
JavaScript一共有六種資料型別。(ES6新增了第七種Symbol型別的值)
- 數值(Number)
- 字串(String)
- 布林值(boolean)
- undefined
- null
- 物件(object)
2.資料型別判斷
JavaScript有三種方法,可以判斷一個值的型別
- typeof運算子
- instanceof運算子
- Object.prototype.toString()方法
typeof運算子
typeof
運算子可以返回一個值的資料型別。
數值、字串、布林值分別返回number
、string
、boolean
。
typeof 123 //"number"
typeof 'hello' //"string"
typeof true //"boolean"
複製程式碼
函式返回function
。
function f(){}
typeof f //"function"
複製程式碼
undefined
返回undefined
。
typeof undefined // "undefined"
複製程式碼
物件返回object
。
typeof {} // "object"
typeof [] // "object"
複製程式碼
null返回
object`。
typeof null // "object"
複製程式碼
instanceof運算子
instanceof
運算子返回一個布林值,表示物件是否為某個建構函式的例項。
由於instanceof
檢查整個原型鏈,因此同一個例項物件,可能會對多個建構函式都返回true
。
instanceof
運算子的一個用處,是判斷值的型別。
var x = []
var f={}
x instanceof Array //true
f instanceof Object //true
複製程式碼
instanceof
運算子只能用於物件,不適用原始型別的值。
利用instanceof
運算子,還可以解決,呼叫建構函式時,忘了加new
命令的問題。
function Fn (f1, f2) {
if (this instanceof Fn) {
this._foo = f1;
this._bar = b2;
} else {
return new Fn(f1, f2);
}
}
複製程式碼
Object.prototype.toString()
toString
方法的作用是返回一個物件的字串形式,預設情況下返回型別字串。
var o1 = new Object();
o1.toString() //"[object Object]"
複製程式碼
toString() 的應用:判斷資料型別
Object.prototype.toString
方法返回物件的型別字串,因此可以用來判斷一個值的型別。
var obj = {};
obj.toString() // "[object Object]"
複製程式碼
上面程式碼呼叫空物件的toString
方法,結果返回一個字串object Object
,其中第二個Object
表示該值的建構函式。這是一個十分有用的判斷資料型別的方法。
由於例項物件可能會自定義toString
方法,覆蓋掉Object.prototype.toString
方法,所以為了得到型別字串,最好直接使用Object.prototype.toString
方法。通過函式的call
方法,可以在任意值上呼叫這個方法,判斷這個值的型別。
Object.prototype.toString.call(value)
複製程式碼
上面程式碼表示對value
這個值呼叫Object.prototype.toString
方法。
不同資料型別的Object.prototype.toString
方法返回值如下。
- 數值:返回
[object Number]
。
Object.prototype.toString.call(12) //"[object Number]"
複製程式碼
- 字串:返回
[object String]
。
Object.prototype.toString.call('ab') //"[object String]"
複製程式碼
- 布林值:返回
[object Boolean]
。
Object.prototype.toString.call(true) //"[object Boolean]"
複製程式碼
- undefined:返回
[object Undefined]
。
Object.prototype.toString.call(undefined) //"[object Undefined]"
複製程式碼
- null:返回
[object Null]
。
Object.prototype.toString.call(null) //"[object Null]"
複製程式碼
- 陣列:返回
[object Array]
。
Object.prototype.toString.call([]) //"[object Array]"
複製程式碼
- 函式:返回
[object Function]
。
var f = function (){}
Object.prototype.toString.call(f) //"[object Function]"
複製程式碼
利用這個特性,可以寫出一個比typeof
運算子更準確的型別判斷函式。
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(3); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
複製程式碼
未完待續