typeof
typeof
操做符是肯定一個變量是String
、Number
、Boolean
,仍是undefined
的最佳工具
引用來源:《JavaScript高級程序設計》圖靈程序設計叢書javascript
看下面例子:java
var s = 'hello'; var num = 10; var bool = true; var und; typeof s; // "string" typeof num; // "number" typeof bool; // "boolean" typeof und; // "undefined"
ok,都檢測出來了,but, 若是檢測的是一個對象
或者null
,就會會返回Object
,以下:
var n = null; var o = new Object(); typeof n; // "object" typeof o; // "object"
看吧,一點區分度也沒有。函數
因此: 在 檢測基本數據類型時,typeof很好用,在檢測引用類型的值時,typeof的做用不大工具
instanceof
var o = new Object(); var arr = []; var reg = /^abc$/ o instanceof Object //true arr instanceof Array //true reg instanceof RegExp //true
注意:使用instanceof
操做符檢測基本數據類型的值時,都會返回false
,儘管下面的例子看起來很矛盾prototype
null instanceof Object // false typeof null // "object"
Object.prototype.toString()
ECMA-262 規範中,toString
方法是這樣定義的:設計
"[object Undefined]"
."[object Null]"
.它能夠返回引用類型更精準的類型檢測
var o = new Object(); var arr = []; var reg = /^abc$/ Object.prototype.toString.call(o) // "[object Object]" Object.prototype.toString.call(arr) // "[object Array]" Object.prototype.toString.call(reg) // "[object RegExp]"
經過函數封裝處理一下:
var type = function (o) { var s = Object.prototype.toString.call(o); return s.match(/\[object (.*?)\]/)[1]; } type(o) // "Object" type(reg) // "RegExp" type(arr) // "Array"