instanceof 检测一个对象A是不是另一个对象B的实例的原理<br />查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象B的prototype为null将会报错(类似于空指针异常)。<br />
function isInstanceOf(instance, klass) {let proto = instance.__proto__let prototype = klass.prototypewhile (true) {if (proto === null) return falseif (proto === prototype) return trueproto = proto.__proto__}}// 测试class Parent {}class Child extends Parent {}const child = new Child()console.log(isInstanceOf(child, Parent), isInstanceOf(child, Child), isInstanceOf(child, Array));
1、检测类型
(1)instanceof可以检测某个对象是不是另一个对象的实例;
var Person = function() {};var student = new Person();console.log(student instanceof Person); // true
(2)instanceof可以检测父类型;
function Person() {};function Student() {};var p = new Person();Student.prototype=p; //继承原型var s=new Student();console.log(s instanceof Student); //trueconsole.log(s instanceof Person); //true
1、typeof
typeof操作符返回一个字符串,表示未经计算的操作数的类型。
JavaScript底层在存储变量时,变量的值是由一个表示类型的标签和实际数据值表示的(都是二进制)。
在JavaScript最初的版本中,使用的时32位系统,为了性能考虑使用低位(前三位)存储了变量的类型信息:
- 000: 对象
- 001: 整数
- 010: 浮点数
- 100: 字符串
- 110: 布尔
undefined和null的机器码比较特殊:
- undefined: -2^30
- null: 全0
typeof会根据值的类型信息返回的对应的字符串,而代表空指针的null的机器码是全0,它的类型标签自然就是000,所以typeof null返回"object"。
typeof NaN 返回 “number”
