JS基础知识点及常见面试题1.2——JS判断数据类型的几种方式

一、JS判断数据类型的方式包括:typeof、instanceof、constructor、Object.prototype.toString.call()、

二、typeof

console.log(typeof 2)            //number
console.log(typeof 'abc')       //string
console.log(typeof true)        //boolean
console.log(typeof undefined)    //undefined
console.log(typeof null)             //object
console.log(typeof 2n);              // bigint
console.log(typeof Symbol(1));  // symbol
console.log(typeof [1,2,3])        //object
console.log(typeof {name:'小米'})    //object
console.log(typeof /1/)                   //object
console.log(typeof function(){})    //function    

 

  1、typeof对于基本数据类型来说,可以判断除null之外所有的基本数据类型

  2、typeof对于引用数据类型来说,除了函数会被判断为function,其他(例如:数组、日期、正则等等)都会统一判定为Object

  3、所以说typeof并不能准确判断变量到底是什么类型,个人认为判断一些简单的基本数据类型还是可以的

  4、typeof null === 'Object' 是一个历史遗留问题,无法修改

  5、typeof NaN === 'number' 

三、instanceof:通过原型链的方式来判断是否是构造函数的实例

// 对于原始数据类型无法检测
console.log(2 instanceof Number);  // false
console.log(1n instanceof BigInt);  // false
console.log(true instanceof Boolean);  // false 
console.log('str' instanceof String);  // false  
console.log(Symbol(1) instanceof Symbol);  // false

// 可以检测内置对象类型
console.log([] instanceof Array);  // true
console.log(function(){} instanceof Function);  // true
console.log({} instanceof Object);  // true   
console.log(/1/ instanceof RegExp);  // true 

// 所有函数对象实例原型链上都存在Function
console.log(Array instanceof Function);  // true 
console.log(Date instanceof Function);  // true 
console.log(RegExp instanceof Function);  // true 
console.log(Function instanceof Function);  // true 
console.log(Object instanceof Function);  // true 

// Object 是所有实例对象原型链的尽头
console.log(Array instanceof Object);  // true 
console.log(Date instanceof Object);  // true 
console.log(RegExp instanceof Object);  // true 
console.log(Function instanceof Object);  // true 
console.log(Object instanceof Object);  // true 

//instanceof 能够判断引用数据类型,但由于是查找原型链,所以不能很精准指出数据类型
console.log([] instanceof Array);  // true
console.log([] instanceof Object);  // true

 

  1、instanceof不能判断基本数据类型

  2、instanceof 能够判断引用数据类型,但由于是查找原型链,所以不能很精准指出数据类型

  3、当构造函数的 prototype 发生改变时,会导致 instanceof 结果发生改变

  4、这其实也侧面反映了一个问题:instanceof 并不是百分之百可信的,所以 instanceof 用于判断数据类型也存在弊端

四、constructor 构造函数

function Fn(){};
Fn.prototype=new Array();
var f=new Fn();
console.log(f.constructor===Fn);    // false
console.log(f.constructor===Array); // true

 

  

五、Object.prototype.toString.call()

 

posted @ 2022-12-30 10:30  最初的样子  阅读(130)  评论(0)    收藏  举报