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.prototype
while (true) {
if (proto === null) return false
if (proto === prototype) return true
proto = 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); //true
console.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”