typeof 和 instanceof

141 阅读1分钟

typeof用来判断基本数据类型

underfind,string,number,boolean,null其中 typeof null是object。

    typeof null // 'object'
    typeof undefined; // "undefined"
    typeof false; // "boolean"
    typeof 1; // "number"
    typeof '1'; // "string"
    typeof {}; // "object" 
    typeof []; // "object" 
    typeof new Date(); // "object"

    typeof Symbol(); // "Symbol"
    typeof 123n // 'bigint'

对于复杂的数据类型,如数据 对象 typeof都是 Object类型,我们可以通过instanceof来判断。

[1,2,3] instanceof Array  //true 

[1,2,3] instanceof Object //true

var fn = function() {};
fn instanceof Function; //true

instanceof:用来判断实例是否是属于某个对象

javascript中的对象都有一个__proto__属性,这个是对象的隐式原型,指向该对象的父对象的原型(prototype)。显式的原型对象使用prototype,但是Object.prototype.proto=null;

    function Person() {};
    function Student() {};
    var p = new Person();
    Student.prototype=p; //继承原型
    var s=new Student();
    console.log(s instanceof Student); //true
    console.log(s instanceof Person); //true

实现instanceof

//规则简单来说就是 L的  __proto__  是不是强等于 R.prototype,不等于再找  L.__proto__ .__proto__  直到 __proto__ 为 null
function instanceof_my(L, R) {
    L = L.__proto__
    R = R.prototype
    while (true) {
        if (L === null) return false;
    
        if (L === R) {
            return true;
        }
    
        L = L.__proto__
    }
}
console.log(instanceof_my([], Object))

1 proto 属性,指向了创建该对象的构造函数的原型 2 所有JS 对象都有 proto 属性,除了Object.prototype.proto === null 3 注意Object(),它是由function生成的,所以它的__proto__属性指向了function的构造器Function的原型Function.prototype 4 注意构造器Function,它是唯一一个prototype和__proto__指向相同的对象 5 一般来说,我们日常自行创建的构造器Foo的__proto__属性指向function的构造器Function的原型Function.prototype,但是构造器的原型对象Foo.prototype的__proto__属性是直接指向Object.prototype对象的