instanceof

概念

  • 判断某个对象是否是构造函数的实例

    语法

    1. object instaceof constructor // object为要测试的实例对象,constructor为构造函数

    手写实现instanceof

    步骤概念

  • 由于instaneof是检测某个对象,所以传入数据必须是对象,才能进行下面的检测操作

  • 左侧的proto 是否和右侧的prototype一致 (对象是否是构造函数的实例)
  • 如果不一致,会一直向上找。直到找到为止,找到返回true,找不到返回false

    1. function instance_of (L, R) {
    2. const baseType = ['string', 'boolean', 'number', 'undefined','Symbol']
    3. if (baseType.includes(typeof L)) return false // 检测某个对象
    4. if (L === null) return false // 检测某个对象
    5. L = L.__proto__
    6. let RP = R.prototype
    7. while(L) { // 无限循环
    8. if (L === null) return false // 找到最顶层,Object.prototype === null 返回false
    9. if (L === RP) return true // 如果左侧的__proto__ 是否和右侧的prototype一致,返回true
    10. L= L.__proto__ // 没找到继续向上一层原型链查找
    11. }
    12. }
    13. console.log(instance_of([], Array)) // true
    14. console.log(instance_of('e', Array)) // false
    15. console.log(instance_of(null, Object)) // false
    1. function instance_of (L, R) {
    2. if (typeof L !== 'object' && typeof L !=== 'function') return false // 检测某个对象
    3. if (L === null) return false // 检测某个对象
    4. L = L.__proto__
    5. let RP = R.prototype
    6. while(L) { // 无限循环
    7. if (L === null) return false // 找到最顶层,Object.prototype === null 返回false
    8. if (L === RP) return true // 如果左侧的__proto__ 是否和右侧的prototype一致,返回true
    9. L= L.__proto__ // 没找到继续向上一层原型链查找
    10. }
    11. }
    12. console.log(instance_of([], Array)) // true
    13. console.log(instance_of('e', Array)) // false
    14. console.log(instance_of(null, Object)) // false

    注意:

  • instancef玩的是原型链,你如果不是原型链的,当一个对象不是通过原型构造出来的,instanceof,就会失效 ```java function Fun(){} const f = new Fun() console.log(f instanceof Fun) // true

function Fun2(){return {}} const f2 = new Fun2() console.log(f2 instanceof Fun2) // false

  1. <a name="HDpDt"></a>
  2. # typeof
  3. <a name="dfF0S"></a>
  4. ## 概念
  5. typeof返回一个字符串,表示未经计算的操作数的类型
  6. <a name="1O7B1"></a>
  7. ## 历史发展:
  8. 在很早之前,使用的32位系统,为了性能考虑使用低位存储了变量的类型信息.
  9. - 000 对象
  10. - 1 整数
  11. - 010 浮点数
  12. - 100 字符串
  13. - 110 布尔
  14. 此外还有2个比较特殊的指: `undefined` 和 `null`
  15. - undefined 用 (-2^30) 表示
  16. - null 对应机器码的 NULL 指针,一般是全零
  17. 这样一来,`null` 就出了一个bug.因为它对应的空指针,低位是000,因此被判断成一个对象了.且这个bug,应该是永远都不会去修复了。
  18. <a name="n2zLb"></a>
  19. ## 可检测类型
  20. ```javascript
  21. console.log(typeof undefined) // undefined
  22. console.log(typeof null) // object
  23. console.log(typeof 123n) // bigint
  24. console.log(typeof Symbol('str')) // symbol
  25. console.log(typeof (() => {})) // function
  26. console.log(typeof {}) // object

注意:

let 和 const 块级作用域后,在其被声明之前对块中的let 和 const 变量使用 typeof 将会抛出一个 ReferenceError

typeof类型检测终结解决方法

  1. function getType (obj) {
  2. let type = Object.prototype.toString.call(obj)
  3. return type.split(' ')[1].replace(']', '')
  4. // Object.prototype.toString 会返回一个形如"[object XXX]"的字符串
  5. // split(' ') 将字符串用空格分隔,转化为数组
  6. }
  7. console.log(getType([]))

Object.prototype.toString 讲解

  • Object.prototype.toString 会返回一个形如”[object XXX]”的字符串
  • 对于Object.prototype.toString.call(arg),若参数为null或undefined,直接返回结果。
  • 若参数不为null或undefined,则将参数转为对象,再作判断。对于原始类型,转为对象的方法即装箱,此处不赘述。

转为对象后,取得该对象的[Symbol.toStringTag]属性值(可能会遍历原型链)作为tag,如无该属性,或该属性值不为字符串类型,则依下表取得tag, 然后返回”[object “ + tag + “]”形式的字符串。