typeof&instanceof操作符

七种数据类型

基本数据类型(简单数据类型或原始类型):Undefined、Null、Boolean、Number、String
复杂数据类型:Object
ES6新增的数据类型:Symbol
对象是最复杂的数据类型,他可以分为三个子类型:object、array、function(不正规说法)

typeof操作符

	var s = "yicong";
	var b = true;
	var n = null;
	var u;
	var o = new Object();
	function f(){};
	typeof s; // string
	typeof b; // boolean
	typeof n; // object 特殊
	typeof u; // undefined
	typeof o; // object
	typeof f; // function 
	typeof Symbol(); // symbol
	typeof {}; // object
	typeof []; // object
	typeof window; // object
	typeof NaN; // number
复制代码

如上所知:

当在检测引用类型的时候,typeof它返回的结果都是Object,所以在检测引用值类型的时候typeof的用处并不大,所以我们使用了ECMAScript提供的instanceof操作符来检测引用类型值。

  • 如果是引用类型值,那么instanceof操作符就会返回true
  • 注意:所有引用类型的值都是Object的实例,如果使用instanceof操作符去检测基本类型的值,则它会返回false

为什么所有引用类型的值都是Object的实例?

因为当你在控制台写下 [] 的时候,它已经给你隐式帮你new Array()了,Array()是一个构造函数,所以[]就是对象的实例。

解答: 因为基本类型不是对象

手撕instanceof操作符

function instance_of(ordinary,construct){
    let conProto = construct.prototype;
    ordinary = ordinary.__proto__;
    while(true){//一直循环下去,也就是在ordinary的原型链上寻找,直到ordinary的原型链上有construct.prototype为止
        if(ordinary === null){
            return false;
        }	
        if (ordinary === conProto){
            return true;
        }
        ordinary = ordinary.__proto__;
    }
}
复制代码

也就是说:

  • ordinary对象是不是construct构造函数构造(new)出来的,
  • ordinary对象的原型链上有没有construct的原型

例子:

function Fn() {						// 构造函数

}
var fn = new Fn();                   //普通对象

console.log(fn instanceof Object) 	// fn的原型链上有没有Object.prototype ?
console.log(fn instanceof Function) // fn的原型链上有没有Function.prototype ?
console.log(fn instanceof Fn)		// fn的原型链上有没有Fn.prototype ?
console.log(Fn instanceof Function)	// Fn的原型链上有没有Function.prototype ?
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享