js检测数据类型
1、typeof
①typeof对于基本数据类型来说,除了null都可以显示正确的类型;
②typeof对于对象来说,除了函数都会显示为Object,所以说typeof不能准确判断变量到底是什么类型,所以想判断一个对象的正确数据类型,这时候可以考虑instanceof;
③typeof可以判断基本数据类型(除了null以外 ),但是引用数据类型中除了function类型外,其他也无法判断。
④例子:console.log( typeof 2 ); // number
console.log( typeof 'str' ); // string
console.log( typeof true ); // boolean
console.log( typeof undefined ); // undefined
console.log( typeof null ); // Object
console.log( typeof [] ); //Object
console.log( typeof {} ); //Object
console.log( typeof function(){} ); // function
2、instanceof
①可以正确的判断对象的类型,因为内部机制是通过对象的原型链中是不是能找到类型的prototype;
②instanceof可以准确的判断复杂的引用数据类型,但是不能判断基本数据类型;
③例子:console.log( 2 instanceof Number ); //false
console.log( 'str' instanceof String ); //false
console.log( true instanceof Boolean ); //false
console.log( [] instanceof Array ); //true
console.log( {} instanceof Object ); //true
console.log( function(){} instanceof Function ); //true
undefined和null由于没有原型prototype所以使用instanceof检测时会报错( undefined/null is not defined )
3、constructor
①可以准确的判断基本数据类型(除undefined和null)以及引用数据类型;
②利用类和实例的关系,因为实例的constructor一般都等于类.prototype.constructor,也就是当前类本身(前提是原型的constructor没有被破坏)
③如果创建一个对象,更改它的原型,constructor就不建议使用了。
④例子:console.log( (2).constructor === Number ); //true
console.log( ('str').constructor === String ); //true
console.log( (true).constructor === Boolean ); //true
console.log( ([]).contructor === Array ); //true
console.log( ({}).constructor === Object ); //true
console.log( (function(){}).constructor === Function );//true
⑤更改原型,例子:function Fn(){}
Fn.prototype = new Array();
var f = new Fn();
console.log( f.constructor === Fn ); //false
console.log( f.constructor === Array ); //true
4、Object.prototype.toString.call()
①toString()是Object的原型方法,调用该方法,可以统一返回格式'[Object,数据类型]'的字符串;
②对于Object对象,直接调用toString()就能返回[object Object];而对于其他对象就需要通过call来调用,才能返回正确的类型信息。
③例子:Object.prototype.toString({}); //"[object Object]"
Object.prototype.toString.call(1); //"[object Number]"
Object.prototype.toString.call('str'); //"[object String]"
Object.prototype.toString.call(true); //"[object Boolean]"
Object.prototype.toString.call(null); //"[object Null]"
Object.prototype.toString.call(undefined); //"[object Undefined]"
Object.prototype.toString.call(function(){}); //"[object Function]"
Object.prototype.toString.call([]); //"[object Array]"
Object.prototype.toString.call({}); //"[object Object]"
Object.prototype.toString.call(/123/g); //"[object RegExp]"
Object.prototype.toString.call(new Date()); //"[object Date]"
Object.prototype.toString.call(document); //"[object HTMLDocument]"
Object.prototype.toString.call(window); //"[object Window]"
5、实现全局通用的数据类型判断( typeof + Object.prototype.toString.call() )
function GetType( obj ){
//使用typeof判断,如果是基本数据类型(number、string、boolean、undefined、function ),直接返回( 除了null ),注意:返回值首字母小写
let type = typeof obj;
if( type !== 'object' ){
return type
}
//对于typeof返回结果为object的在使用Object.prototype.toString.call()进行判断( null 、Array、Date、RegExp ),注意:返回值首字母大写
return Object.ptototype.toString.call( obj ).replace(/^\[object (\S+)\]$/,'$1')
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器