JavaScript中typeof instanceof常用老判斷一個變量是否為空,或者是什么類型的。但是他們之間還是有區(qū)別的
1. typeof
typeof是一個一元運算,放在一個運算數(shù)之前,運算數(shù)可以是任意類型
它返回值是一個字符串,該字符串說明運算符的類型
typeof一般只能返回如下幾個結(jié)果:“number”,“string”,“boolean”,“object”,“function”,“undefined”.
<script type="text/javascript">
var str = "hhhh";
var num = 12334;
var obj = {};
var fn = function(){
console.log(11111)
}
var arr = [];
var boolea = false;
var a = null;
var b;
// string number object function object boolean object undefined
console.log(typeof str, typeof(num), typeof obj, typeof fn, typeof arr, typeof boolea, typeof a, typeof b)
</script>
即我們可以通過typeof判斷一個變量是否存在。例如
if(typeof a!="undefined"){alert("ok")}
而不要去使用if(a),因為如果a不存在(為聲明)則會報錯。對于 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的局限性。
經(jīng)常會在js里用到數(shù)組,比如 多個名字相同的input, 若是動態(tài)生成的, 提交時就需要判斷其是否是數(shù)組.
if(document.mylist.length != "undefined" ) {} //這個用法有誤.
正確的是
if( typeof(document.mylist.length) != "undefined" ) {}
或 if( !isNaN(document.mylist.length) ) {}
在JavaScript中,判斷一個變量的類型常常會用typeof運算符,在使用該運算符時采用引用類型存儲值會出現(xiàn)一個問題,無論引用的是什么類型的對象,他都返回”object“,這時就要用到instanceof
2. instanceof 檢測某個對象是不是另一個對象的實例,即測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的prototype屬性
語法: object(要檢測是對象) instanceof constructor(某個構(gòu)造函數(shù))
如 :var a=new Array();
alert(a instanceof Array); // true,
同時 alert(a instanceof Object) //也會返回 true;
這是因為 Array 是 object 的子類。
再如:function test(){};
var a=new test();
alert(a instanceof test) 會返回true
另外,更重的一點是 instanceof 可以在繼承關(guān)系中用來判斷一個實例是否屬于它的父類型。
例如:
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型繼承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
上面的代碼中是判斷了一層繼承關(guān)系中的父類,在多層繼承關(guān)系中,instanceof 運算符同樣適用。