typeof&instanceof操做符

  • 七种数据类型

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

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复制代码

如上所知:java

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

  • 若是是引用类型值,那么instanceof操做符就会返回truegit

  • 注意:全部引用类型的值都是Object的实例,若是使用instanceof操做符去检测基本类型的值,则它会返回falsegithub

为何全部引用类型的值都是Object的实例?

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

  • 解答:由于基本类型不是对象ui

手撕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__;
    }
}复制代码

也就是说:spa

  • ordinary对象是否是construct构造函数构造(new)出来的,prototype

  • ordinary对象的原型链上有没有construct的原型code

更多文章请转移:github.com/wangyicong
对象

相关文章
相关标签/搜索