前言
instanceof和typeof是两个运算符,在程序设计中用到,常用来判断一个变量是否为空,或者是什么类型的。
typeof
typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。它返回值是一个字符串,该字符串说明运算数的类型。
typeof其实就是判断参数是什么类型的实例,就一个参数
typeof 一般只能返回如下几个结果:number
、string
、boolean
、object
、function
和 undefined
。
console.log(typeof (1));//typeof(1)返回"number"
console.log(typeof ("1"));//typeof("1")返回"string"
var demo1 = true;
var demo2= new Object();
var demo3= function(){};
var demo4= undefined;
console.log(typeof(demo1)+"\n"+
typeof(demo2)+"\n"+typeof(demo3)+typeof(demo4));
//boolean object function underfined
而对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性
var arr=[];
var b=null;
console.log(typeof(arr)+"\n"+typeof(b));
//object object
在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。
instanceof
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
instanceof 用于判断一个变量是否某个对象的实例,如 var a=new Array();alert(a instanceof Array); 会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。
// 定义构造函数
function C(){}
function D(){}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object // true,同上
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上
网友评论