大家可能知道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中推断对象详细类型的更多相关文章

  1. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  2. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  3. 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

  4. JS中String类型转换Date类型 并 计算时间差

    JS中String类型转换Date类型 1.比较常用的方法,但繁琐,参考如下:主要使用Date的构造方法:Date(int year , int month , int day)<script& ...

  5. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  6. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  7. Js中Map对象的使用

    Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...

  8. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

  9. js中arguments对象和this对象

    js中arguments对象和this属性 如果不注重复习,花时间准备的材料毫无意义 arguments对象和this对象都是对象 直接来代码 <!DOCTYPE html> <ht ...

随机推荐

  1. Python眼睛护士改进版

    添加了设定从(0,0)显示:self.root.geometry('1000x200+0+0')其实主要是两个0.那个1000和200是没用的,因为已经设定了minsize. 添加了窗口置顶:self ...

  2. 【DRP】删除递归树的操作

    正如图呈现的树结构.本文从任意节点删除树形结构.提供解决方案 图中,不包括其他结点的是叶子结点.包括其他结点的是父结点,即不是叶子结点. 一 本文的知识点: (1)递归调用: 由于待删除的结点的层次是 ...

  3. java插入字符串

    JAVA insert() 插入字符串insert() 插入字符串StringBuffer insert(int index,String str)StringBuffer insert(int in ...

  4. Codeforces Round#309 C Kyoya and Colored Balls

    给定一个k表示颜色的种类从1到k 然后接下来k行, 每行一个数字, 代表该颜色的球有多少个 这些球都放在一个包中,然后依次拿出.  要求颜色i的最后一个球, 必须要排在颜色i+1的最后一个球前面,   ...

  5. 【原创】poj ----- 1182 食物链 解题报告

    题目地址: http://poj.org/problem?id=1182 题目内容: 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  6. [Sqlite]--&gt;Java采用jdbc联系Sqlite各种特定的工艺数据库的数据操作

    引:     1, Sqlite在Windows.Linux 和 Mac OS X 上的安装过程     2.嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录     3,嵌 ...

  7. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...

  8. 编译Android源代码与内核总结

    这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.and ...

  9. linux上安装配置vsftpd(转)

    转自:http://www.webarch.org/category/linux生产环境是Centos5.6,由于需要提供ftp服务,就找了一款比较小巧的ftp服务器端软件,vsftpd(vsftpd ...

  10. C#(SuperWebSocket)与websocket通信

    原文:C#(SuperWebSocket)与websocket通信 客户端代码 点击可以查看一些关于websocket的介绍 <!DOCTYPE html> <html> &l ...