JS中 typeof 与 instanceof 的区别
JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。但它们之间还是有区别的:
typeof
是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型。
typeof 一般只能返回如下几个结果:number,boolean,string,function,object,undefined。(Array,Null 均返回 object ,无法判断这些类型)
例子:
typeof(1): number typeof(NaN): number typeof(Number.MIN_VALUE): number typeof(Infinity): number typeof("123"): string typeof(true): boolean typeof(window): object typeof(Array()): object typeof(function(){}): function typeof(document): object typeof(null): object typeof(eval): function typeof(Date): function typeof(sss): undefined typeof(undefined): undefined
我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){ alert("ok") },而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错,
对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。
如果我们希望获取一个对象是否是数组,或判断某个变量是否是某个对象的实例则要选择使用instanceof。
instanceof 用于判断一个对象是否是某个类或者它的子类的一个实例,instanceof通过返回一个布尔值来指出。
如果判断对象是直接赋值的string number undefined类型变量 ,可能无法输出结果。
<script> var a = new Number(9); var b = 9; var c = 'hello' var d = ['hello','hi'] var e = {'name':'joyo','age':18}; var f = function(){}; var g = 0; var h = ''; // 当值为空或者 undefined 时 ,用 instanceof 无法判断 ,可以用 typeof document.write(a instanceof Number ) // ture document.write(b instanceof Number ) // false 直接赋值的 Number 变量 false * (如果是用new申明的结果为 true ,下同) document.write(c instanceof String) // false 直接赋值的 string 变量 false * document.write(d instanceof Array) // true 直接赋值的 Array 变量 true document.write(e instanceof Object) // true 直接赋值的 Object 变量 true document.write(f instanceof Function) // true 直接赋值的 Function 变量 true document.write(g instanceof Boolean) // false 直接赋值的 Boolean 变量 false * </script>
用法一:
<script> var a=new Array(); document.write(a instanceof Array); // true document.write(a instanceof Object); // true Array是object的子类。 </script>
用法二:
再如:
<script> function test(){}; var a = new test(); document.write(a instanceof test) // true </script>
用法三:
<script> if(window instanceof Object) alert('Y'); else alert('N') // 输出 Y 说明 window 也是一个对象的一个实例 alert(typeof(window)) // 输出 object </script>
谈到instanceof我们要多插入一个问题,就是function的arguments,我们大家也许都认为arguments是一个Array,但如果使用instaceof去测试会发现arguments不是一个Array对象,尽管看起来很像。(这个待验证)