typeof
用于判断数据类型,返回值有number、string、boolean、function、undefined、object 六个。
<script>
let a = [1, 2, 3, 4, 5];
let b = 1;
let c = "weaface";
let d = false;
let f = null;
let e = new Date();
let g = undefined;
let h = function () {};
console.log(typeof(a));//object
console.log(typeof(b));//number
console.log(typeof(c));//string
console.log(typeof(d));//boolean
console.log(typeof(e));//object
console.log(typeof(f));//object
console.log(typeof(g));//undefined
console.log(typeof(h));//function
console.log(typeof(i));//undefined
</script>
在这里我们可以看到typeof判断null、array、object以及函数的实例(new + 函数)时,它返回的都是object。这就导致在判断这些数据类型的时候得不到真实的数据类型。由此引出instanceof。
instanceof
instance的意思是实例,因此可以知道instanceof的作用就是判断该对象是谁的实例,我们也就知道了instanceof是对象运算符。
这就牵扯到了对象的继承,他的判断就是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true,否则为false。
总结
总之,typeof 和 instanceof 都是用来判断变量类型的,区别在于:
1、typeof判断所有变量的类型,返回值有number、string、boolean、function、object、undefined。
2、typeof对于丰富的对象实例,只能返回object,导致有时候得不到真实的数据类型。
3、instanceof用来判断对象,代码形式(obj1 instanceof obj2)(判断obj1是否为obj2的实例),obj2必须为对象,否则会报错。返回的是布尔值。
4、instanceof可以对不同的实例对象进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在于obj1的原型链上,(obj1 instanceof obj2)值为true。