JavaScript中typeof instanceof常用老判断一个变量是否为空,或者是什么类型的。但是他们之间还是有区别的
1. typeof
typeof是一个一元运算,放在一个运算数之前,运算数可以是任意类型
它返回值是一个字符串,该字符串说明运算符的类型
typeof一般只能返回如下几个结果:“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 的局限性。
经常会在js里用到数组,比如 多个名字相同的input, 若是动态生成的, 提交时就需要判断其是否是数组.
if(document.mylist.length != "undefined" ) {} //这个用法有误.
正确的是
if( typeof(document.mylist.length) != "undefined" ) {}
或 if( !isNaN(document.mylist.length) ) {}
在JavaScript中,判断一个变量的类型常常会用typeof运算符,在使用该运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,他都返回”object“,这时就要用到instanceof
2. instanceof 检测某个对象是不是另一个对象的实例,即测试一个对象在其原型链中是否存在一个构造函数的prototype属性
语法: object(要检测是对象) instanceof constructor(某个构造函数)
如 :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 可以在继承关系中用来判断一个实例是否属于它的父类型。
例如:
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型继承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
上面的代码中是判断了一层继承关系中的父类,在多层继承关系中,instanceof 运算符同样适用。