手动实现一下instanceof 和 JS数据类型-转换

174 阅读1分钟

1.手动实现一下instanceof

    function myInstanceof(value, type) {
        // 基本数据类型直接返回false
        if (typeof value !== 'object' || value === null) return false;
        // getPrototypeOf是Object对象自带的一个方法,获取参数的原型对象
        let proto = Object.getPrototypeOf(value);
        while(true) {
            // 查找到尽头,还没有找到,返回false
            if (proto == null) return false;
            // 找到相同的原型对象,返回 true;
            if (proto == type.prototype) return true;
            proto = Object.getPrototypeOf(proto);
        }
    }
    console.log(myInstanceof('665',String)); //false
    console.log(myInstanceof(new String('666'), String)); //true
    console.log(myInstanceof(new Boolean(false), Boolean)); //true

2. JS数据类型-转换

1.[] == ![] 结果?

解析:

== 中,左右两边都需要转换为数字然后进行比较。

[]转换为数字为0。

![] 首先是转换为布尔值,由于[]作为一个引用类型转换为布尔值为true, 因此![]为false,进而在转换成数字,变为0。

0 == 0 , 结果为true

2.== 和 ===有什么区别?

解析:

===叫做严格相等,是指:左右两边不仅值要相等,类型也要相等,例如'1'===1的结果是false,因为一边是string,另一边是number。


  ==不像===那样严格,对于一般情况,只要值相等,就返回true,但==还涉及一些类型转换,它的转换规则如下:
  • 两边的类型是否相同,相同的话就比较值的大小,例如1==2,返回false
  • 判断的是否是null和undefined,是的话就返回true
  • 判断的类型是否是String和Number,是的话,把String类型转换成Number,再进行比较
  • 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较
  • 如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较
console.log({a: 1} == true);//false
console.log({a: 1} == "[object Object]");//true