typeof用来判断基本数据类型
underfind,string,number,boolean,null其中 typeof null是object。
typeof null // 'object'
typeof undefined; // "undefined"
typeof false; // "boolean"
typeof 1; // "number"
typeof '1'; // "string"
typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"
typeof Symbol(); // "Symbol"
typeof 123n // 'bigint'
对于复杂的数据类型,如数据 对象 typeof都是 Object类型,我们可以通过instanceof来判断。
[1,2,3] instanceof Array //true
[1,2,3] instanceof Object //true
var fn = function() {};
fn instanceof Function; //true
instanceof:用来判断实例是否是属于某个对象
javascript中的对象都有一个__proto__属性,这个是对象的隐式原型,指向该对象的父对象的原型(prototype)。显式的原型对象使用prototype,但是Object.prototype.proto=null;
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
实现instanceof
//规则简单来说就是 L的 __proto__ 是不是强等于 R.prototype,不等于再找 L.__proto__ .__proto__ 直到 __proto__ 为 null
function instanceof_my(L, R) {
L = L.__proto__
R = R.prototype
while (true) {
if (L === null) return false;
if (L === R) {
return true;
}
L = L.__proto__
}
}
console.log(instanceof_my([], Object))
1 proto 属性,指向了创建该对象的构造函数的原型 2 所有JS 对象都有 proto 属性,除了Object.prototype.proto === null 3 注意Object(),它是由function生成的,所以它的__proto__属性指向了function的构造器Function的原型Function.prototype 4 注意构造器Function,它是唯一一个prototype和__proto__指向相同的对象 5 一般来说,我们日常自行创建的构造器Foo的__proto__属性指向function的构造器Function的原型Function.prototype,但是构造器的原型对象Foo.prototype的__proto__属性是直接指向Object.prototype对象的