instanceof 检测一个对象A是不是另一个对象B的实例的原理
<br />
查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象B的prototype为null将会报错(类似于空指针异常)。<br />

  1. function isInstanceOf(instance, klass) {
  2. let proto = instance.__proto__
  3. let prototype = klass.prototype
  4. while (true) {
  5. if (proto === null) return false
  6. if (proto === prototype) return true
  7. proto = proto.__proto__
  8. }
  9. }
  10. // 测试
  11. class Parent {}
  12. class Child extends Parent {}
  13. const child = new Child()
  14. console.log(isInstanceOf(child, Parent), isInstanceOf(child, Child), isInstanceOf(child, Array));

1、检测类型

(1)instanceof可以检测某个对象是不是另一个对象的实例;

  1. var Person = function() {};
  2. var student = new Person();
  3. console.log(student instanceof Person); // true

(2)instanceof可以检测父类型;

  1. function Person() {};
  2. function Student() {};
  3. var p = new Person();
  4. Student.prototype=p; //继承原型
  5. var s=new Student();
  6. console.log(s instanceof Student); //true
  7. console.log(s instanceof Person); //true

1、typeof

typeof操作符返回一个字符串,表示未经计算的操作数的类型。

JavaScript底层在存储变量时,变量的值是由一个表示类型的标签和实际数据值表示的(都是二进制)。
在JavaScript最初的版本中,使用的时32位系统,为了性能考虑使用低位(前三位)存储了变量的类型信息:

  • 000: 对象
  • 001: 整数
  • 010: 浮点数
  • 100: 字符串
  • 110: 布尔

undefinednull的机器码比较特殊:

  • undefined: -2^30
  • null: 全0

typeof会根据值的类型信息返回的对应的字符串,而代表空指针的null的机器码是全0,它的类型标签自然就是000,所以typeof null返回"object"

typeof NaN 返回 “number”