js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断。看下面的情况
<script>
alert(typeof 1);//number
alert(typeof "2");//string
alert(typeof [1,2,3]);//object
alert(typeof {"name":"zhuhui"})//object
</script>
从上面中我们可以看出数组和普通对象用typeof判断出来都是object,但是现在我们有这个需求,我们要明确判断出这个对象是具体的哪个对象(比如数组对象,日期对象,正则表达式对象,其他自定义对象,DOM对象等等)那怎么办呢。其实js中有个方法可以准备的判断出
Object.prototype.toString.call
var type=function(v){
return Object.prototype.toString.call(v);
};
alert(type(null));//[object Null]
alert(type(undefined));//[object Undefined]
alert(type(1));//[object Number]
alert(type(true));//[object Boolean]
alert(type("2"));//[object String]
alert(type([1,2,3]));//[object Array]
alert(type({"name":"zhuhui"}));//[object Object]
alert(type(type));//[object Function]
alert(type(new Date()));//[object Date]
alert(type(/^\d+$/));//[object Regexp]
关于这个方法更深入的说明请参考http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
下面是以前做项目封装判断常见数据类型的js
/**
* type.js 数据类型检测函数
* @author 朱辉
* @email javaee6@qq.com
* @version 0.1
*/
(function(window, undefined){
xjo = window.xjo ||
{
plugin: {}
};
xjo.type = {};
//检测v的类型 辅助函数
var type = function(v){
return Object.prototype.toString.call(v);
};
/**
* 是否为数组对象类型 如果是就返回true 如果不是就返回false
* @namespace xjo.type
* @method isArray
* @param {Any} v 被检测的变量
* @return {Boolean} 结果
*/
xjo.type.isArray = function(v){
return type(v) === '[object Array]';
};
/**
* 是否为参数管理器Arguments 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isArguments = function(v){
return v.callee != undefined;
};
/**
* 是否为迭代序列 包含Array与Arguments 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isIterable = function(v){
return xjo.type.isArray(v) || xjo.type.isArguments(v);
};
/**
* 是否为空对象 null和undefined和数组的长度为0或空字符串("") 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @param {Boolean} allowBlank [可选] 默认false 空字符串认为是空对象 反之 空字符串不认为是空对象
* @return {Boolean}
*/
xjo.type.isEmpty = function(v, allowBlank){
return v === null || v === undefined ||
(xjo.type.isArray(v) && !v.length) ||
(!allowBlank ? v === '' : false);
};
/**
* 是否为字符串类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isString = function(v){
return typeof v === 'string';
};
/**
* 是否为数字类型(为Number且不为正负无穷大数字) 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isNumber = function(v){
return typeof v === 'number' && isFinite(v);
};
/**
* 是否为布尔值类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isBoolean = function(v){
return typeof v === 'boolean';
};
/**
* 是否为函数类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isFuntion = function(v){
return type(v) === '[object Function]';
};
/**
* 是否为对象类型
* @param {Any} v 被检测的变量
* @return {boolean}
*/
xjo.type.isObject = function(v){
return !!v && type(v) === '[object Object]';
};
/**
* 是否为日期类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {boolean}
*/
xjo.type.isDate = function(v){
return type(v) === '[object Date]';
};
/**
* 是否为正则表达式类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isRegexp = function(v){
return type(v) == '[object RegExp]';
};
/**
* 是否为原始数据类型 如果是就返回true 如果不是就返回false
* @param {Any} v 被检测的变量
* @return {Boolean}
*/
xjo.type.isPrimitive = function(v){
return xjo.type.isString(v) || xjo.type.isNumber(v) ||
xjo.type.isBoolean(v);
};
/**
* 返回数据类型的字符串形式<br>
* 数字类型:"number" <br>
* 布尔类型:"boolean" <br>
* 字符串类型:"string" <br>
* 数组类型:"array"<br>
* 日期类型:"date"<br>
* 正则表达式类型:"regexp" <br>
* 函数类型:"function"<br>
* 对象类型:"object"<br>
* 参数管理器类型:"arguments"<br>
* 其他类型:"unknow"
* @param {Any} v 被检测的变量
* @return {String}
*/
xjo.type.type = function(v){
var result = "unknow";
if (xjo.type.isNumber(v)) {
result = "number";
}
if (xjo.type.isBoolean(v)) {
result = "boolean";
}
if (xjo.type.isString(v)) {
result = "string";
}
if (xjo.type.isArray(v)) {
result = "array";
}
if (xjo.type.isDate(v)) {
result = "date";
}
if (xjo.type.isRegexp(v)) {
result = "regexp";
}
if (xjo.type.isFuntion(v)) {
result = "function";
}
if (xjo.type.isObject(v)) {
result = "object";
}
if (xjo.type.isArguments(v)) {
result = "argumetns";
}
return result;
};
xjo.plugin["jo/type"] = true;
})(window);
js中判断对象具体类型的更多相关文章
- js中推断对象详细类型
大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...
- js中判断一个对象的类型的种种方法
javascript中检测对象的类型的运算符有:typeof.constructor.instanceof. typeof:typeof是一个一元运算符,返回结果是一个说明运算数类型的字符串.如:&q ...
- js中判断对象是否存在
s中判断对象是否存在,写法有很多种: 第一种:if (!myObj) { var myObj = { }; }第二种:var global = this; if (!global.myObj) { ...
- js中判断对象类型的几种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- js中判断对象数据类型的方法
对js中不同数据的布尔值类型总结:false:空字符串:null:undefined:0:NaN.true:除了上面的false的情况其他都为true: 如下: var o = { 'name':'l ...
- JS中判断对象是不是数组的方法
JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...
- js 中判断对象是否为空
var dd = function (S_object, name) { console.log(name + '第一步执行结果:' + S_object); if (typeof S_objec ...
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性
前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...
随机推荐
- Spring学习记录(十三)---基于xml文件配置AOP
上一篇讲了用注解配置AOP,现在讲用xml怎么配置AOP 其实逻辑是一样的,只是用xml的方法,要把这种逻辑写出来,告诉spring框架去执行. 例子:这里的例子和上一篇的例子一样.换成xml方式 / ...
- 了解HTML列表
前面的话 从某种意义上讲,不是描述性文本的任何内容都可以认为是列表.人口普查.太阳系.餐馆菜单等都可以表示为一个列表或列表的列表.列表分为无序列表.有序列表和定义列表三种 无序列表 无序列表(unor ...
- Android自定义控件之自定义属性
前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...
- 日常css技巧小结(2)-- inline-block带来的迷惑
一.问题描述 在平时布局中,inline-block使用的频率比很高,主要是因为可以让行标签设置宽高.我在布局过程中,发现了两个“问题”, 1行标签.display:inline-block之后的行标 ...
- 【原创】记一次Project插件开发
一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...
- 一点做用户画像的人生经验(一):ID强打通
1. 背景 在构建精准用户画像时,面临着这样一个问题:日志采集不能成功地收集用户的所有ID,且每条业务线有各自定义的UID用来标识用户,从而造成了用户ID的零碎化.因此,为了做用户标签的整合,用户ID ...
- ListFragment的使用
ListFragment继承了Fragment,顾名思义,ListFragment是一种特殊的Fragment,它包含了一个ListView,在ListView里面显示数据. 1. MainActiv ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- 关于fefo函数
feof是C语言标准库函数函数,其原型在stdio.h中,其功能是检测流上的文件结束符. 函数原型: int feof(FILE *stream); 返回值:如果文件结束,则返回非0值,否则返回0 在 ...
- dpkg:处理软件包dradis (--configure)时出错
dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...