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" ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- JS中String类型转换Date类型 并 计算时间差
JS中String类型转换Date类型 1.比较常用的方法,但繁琐,参考如下:主要使用Date的构造方法:Date(int year , int month , int day)<script& ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- Js中Map对象的使用
Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- js中arguments对象和this对象
js中arguments对象和this属性 如果不注重复习,花时间准备的材料毫无意义 arguments对象和this对象都是对象 直接来代码 <!DOCTYPE html> <ht ...
随机推荐
- vs2008+opencv2.4.9 +win7X64位系统 2.
小编用自身血淋淋的例子,来给大家做个参考,共耗时近2天时间,终于屈服于安装vs2010,然后配置成功了.但是在这个配置成功后,我终于发现了我08配置不成功的原因,写下心得,供各位参考 1.准备工具 v ...
- PHP实现队列(Queue)数据结构
队列(Queue),是一种特殊的先进先出线性表,其只能在前端进行删除操作(一般称为出队),在后端进行插入操作(一般称为入队).进行删除操作的端称为队头,进行插入操作的端称为队尾.队列,是按照先进先出或 ...
- Unity3d socket通信 切换到web版本时报错SecurityException解决办法
原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...
- java获取当前日期时间代码总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 代码如下 复制代码 Date date = new ...
- python手记(52)
python将信息加密进图片 从图片中解密信息 >>> runfile(r'K:\testpro\test1.py', wdir=r'K:\testpro') http://blog ...
- Mina框架断包、粘包问题解决方式
Mina框架断包.粘包问题解决方式 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然.也能够提供JAVA 对象的序 ...
- C#实现仿QQ震动
前提:新建winForm窗体应用程序,放置一个Button,设置按钮的单击事件 ; i < ; i++) { Point p = this.FindForm().Location; ,p.Y+) ...
- Python学习入门基础教程(learning Python)--3.3.3 Python逻辑关系表达式
在if分支判断语句里的条件判断语句不一定就是一个表达式,可以是多个(布尔)表达式的组合关系运算,这里如何使用更多的关系表达式构建出一个比较复杂的条件判断呢?这里需要再了解一下逻辑运算的基础知识.逻辑关 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- datagrid标题头粗体
//标题头粗体 //$("#R_datagrid .datagrid-header-row td div span").each(function (i, th) { ...