js中能否用instanceof判断基本数据类型以及能否手动实现instanceof的功能?

 

对于原始类型来说,除了 null 都可以调用typeof显示正确的类型。 

typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'

但对于引用数据类型,除了函数之外,都会显示"object"。 

typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'

 因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true

 

const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str1 = 'hello world'
str1 instanceof String // false
var str2 = new String('hello world')
str2 instanceof String // true

用下面这种方式判断基本数据类型: 

class PrimitiveNumber {
    static [Symbol.hasInstance](x) {
        return typeof x === 'number'
    }
}
console.log(111 instanceof PrimitiveNumber) //true

其实就是自定义instanceof行为的一种方式,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型。 

实现功能的核心: 原型链的向上查找。 

function myInstanceof(left, right) {
    //基本数据类型直接返回false
    if(typeof left !== 'object' || left === null) return false;
    //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left);
    while(true) {
    //查找到尽头,还没找到
        if(proto == null) return false;
    //找到相同的原型对象
        if(proto == right.prototype) return true;
        proto = Object.getPrototypeOf(proto);
}
}

 

测试结果: 

 

console.log(myInstanceof("111", String));   //false
console.log(myInstanceof(new String("111"), String));  //true

 

你可能感兴趣的:(前端,javascript,javascript,前端)