判断数据类型的方法
typeof
如果使用typeof来判断数据类型的话,结果如下:
console.log( typeof 123, //"number" typeof 'dsfsf', //"string" typeof false, //"boolean" typeof [1,2,3], //"object" typeof {a:1,b:2,c:3}, //"object" typeof function(){console.log('aaa');}, //"function" typeof undefined, //"undefined" typeof null, //"object" typeof new Date(), //"object" typeof /^[a-zA-Z]{5,20}$/, //"object" typeof new Error() //"object" );
以上结果都是在chrome浏览器里运行结果,可以发现如下规律
Array,Object,null,Date,RegExp,Error这几个类型都被typeof判断为object,所以如果想要判断这几种类型,就不能使用typeof了。
Number,String,Boolean,Function,undefined,如果想判断这几种类型,那就可以使用typeof。
instanceof
除了使用typeof来判断,还可以使用instanceof。instanceof运算符需要指定一个构造函数,或者说指定一个特定的类型,它用来判断这个构造函数的原型是否在给定对象的原型链上。
结果如下:
console.log( 123 instanceof Number, //false 'dsfsf' instanceof String, //false false instanceof Boolean, //false [1,2,3] instanceof Array, //true {a:1,b:2,c:3} instanceof Object, //true function(){console.log('aaa');} instanceof Function, //true undefined instanceof Object, //false null instanceof Object, //false new Date() instanceof Date, //true /^[a-zA-Z]{5,20}$/ instanceof RegExp, //true new Error() instanceof Error //true )
可以发现如下规律:
Number,String,Boolean没有检测出他们的类型,但是如果使用下面的写法则可以检测出来:
var num = new Number(123); var str = new String('dsfsf'); var boolean = new Boolean(false);
还需要注意null和undefined都返回了false,这是因为它们的类型就是自己本身,并不是Object创建出来它们,所以返回了false。
constructor
constructor是prototype对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。
如果输出一个类型的实例的constructor,就如下所示:
console.log(new Number(123).constructor) //ƒ Number() { [native code] }
可以看到它指向了Number的构造函数,因此,可以使用num.constructor==Number来判断一个变量是不是Number类型的。
var num = 123; var str = 'abcdef'; var bool = true; var arr = [1, 2, 3, 4]; var json = {name:'wenzi', age:25}; var func = function(){ console.log('this is function'); } var und = undefined; var nul = null; var date = new Date(); var reg = /^[a-zA-Z]{5,20}$/; var error= new Error(); function Person(){ } var tom = new Person(); // undefined和null没有constructor属性 console.log( tom.constructor==Person, num.constructor==Number, str.constructor==String, bool.constructor==Boolean, arr.constructor==Array, json.constructor==Object, func.constructor==Function, date.constructor==Date, reg.constructor==RegExp, error.constructor==Error ); //所有结果均为true
除了undefined和null之外,其他类型都可以通过constructor属性来判断类型。
使用toString()检测对象类型
可以通过toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为thisArg。
var toString = Object.prototype.toString; toString.call(123); //"[object Number]" toString.call('abcdef'); //"[object String]" toString.call(true); //"[object Boolean]" toString.call([1, 2, 3, 4]); //"[object Array]" toString.call({name:'wenzi', age:25}); //"[object Object]" toString.call(function(){ console.log('this is function'); }); //"[object Function]" toString.call(undefined); //"[object Undefined]" toString.call(null); //"[object Null]" toString.call(new Date()); //"[object Date]" toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]" toString.call(new Error()); //"[object Error]"
这样可以看到使用Object.prototype.toString.call()的方式来判断一个变量的类型是最准确的方法。
封装一个获取变量准确类型的函数
function gettype(obj) { var type = typeof obj; if (type !== 'object') { return type; } //如果不是object类型的数据,直接用typeof就能判断出来 //如果是object类型数据,准确判断类型必须使用Object.prototype.toString.call(obj)的方式才能判断 return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); }
这样判断一个变量的数据类型就很方便了。
相关文章
- 有关判断为空的简写方法
- js中判断对象是否为空的三种实现方法
- PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)
- 判断元素16种方法expected_conditions
- 判断目标函数凸或者凹的方法
- JS判断字符串变量是否含有某个字串的实现方法
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
- 字符串--java中判断字符串是否为数字的方法的几种方法?
- python判断字符串是否是json格式方法分享
- Atitit 知识与数据 信息 加工方法总结 目录 1.1. 信息加工是指通过判别、筛选、分类、排序、分析和研究等一系列过程1 1.2. 多种聚合方法1 2. 首先通过聚类信息 专题化 分组聚
- atitit.判断时间重叠方法总结 java c++ c#.net js php
- Atitit.研发管理--提升效率--软件开发方法DSM总结o99
- paip.函数式编程方法概述以及总结
- Angular自定义structural指令的实例化过程以及set方法的调用
- Android 的调试方法
- Qt QVector常见使用方法
- Qt如何实现可拖动按钮的方法
- 【C语言】字符数组初始化方法
- setattr()、getattr()、hasattr()【设置属性和方法、得到属性、判断是否有属性和方法】
- js多个文件格式的判断并处理方法
- js判断数字的方法
- js判断空对象的方法
- C/C++,在类中存在static静态变量,static变量初始化方法
- 对表型数据框进行去冗余 phe 表型信息提取 临床信息提取 自建函数提取 种方法数据框里面进行取子集操作,坐标、列名和逻辑判断每列满足某个要求每行满足某个要求按条件筛选数据库dataframe
- (60)C#里判断引用相等的方法
- JS中判断null、undefined与NaN的方法
- Andoid自动判断输入是电话,网址或者Email的方法--Linkify
- SSIS 无视 Execute Package task 控件的错误, 不会导致整个package报错的方法
- Python21day学习---numpy生成数组的若干方法----day19