七种数据类型
基本数据类型(简单数据类型或原始类型):Undefined、Null、Boolean、Number、String
复杂数据类型:Object
ES6新增的数据类型:Symbol
对象是最复杂的数据类型,他可以分为三个子类型:object、array、function(不正规说法)
typeof操作符
var s = "yicong";
var b = true;
var n = null;
var u;
var o = new Object();
function f(){};
typeof s; // string
typeof b; // boolean
typeof n; // object 特殊
typeof u; // undefined
typeof o; // object
typeof f; // function
typeof Symbol(); // symbol
typeof {}; // object
typeof []; // object
typeof window; // object
typeof NaN; // number
复制代码
如上所知:
当在检测引用类型的时候,typeof它返回的结果都是Object,所以在检测引用值类型的时候typeof的用处并不大,所以我们使用了ECMAScript提供的instanceof操作符来检测引用类型值。
- 如果是引用类型值,那么instanceof操作符就会返回true;
- 注意:所有引用类型的值都是Object的实例,如果使用instanceof操作符去检测基本类型的值,则它会返回false;
为什么所有引用类型的值都是Object的实例?
因为当你在控制台写下 [] 的时候,它已经给你隐式帮你new Array()了,Array()是一个构造函数,所以[]就是对象的实例。
解答: 因为基本类型不是对象
手撕instanceof操作符
function instance_of(ordinary,construct){
let conProto = construct.prototype;
ordinary = ordinary.__proto__;
while(true){//一直循环下去,也就是在ordinary的原型链上寻找,直到ordinary的原型链上有construct.prototype为止
if(ordinary === null){
return false;
}
if (ordinary === conProto){
return true;
}
ordinary = ordinary.__proto__;
}
}
复制代码
也就是说:
- ordinary对象是不是construct构造函数构造(new)出来的,
- ordinary对象的原型链上有没有construct的原型
例子:
function Fn() { // 构造函数
}
var fn = new Fn(); //普通对象
console.log(fn instanceof Object) // fn的原型链上有没有Object.prototype ?
console.log(fn instanceof Function) // fn的原型链上有没有Function.prototype ?
console.log(fn instanceof Fn) // fn的原型链上有没有Fn.prototype ?
console.log(Fn instanceof Function) // Fn的原型链上有没有Function.prototype ?
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END





















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)