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 ...
随机推荐
- HDU 1016 Prime Ring Problem 题解
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...
- HDU 1164 Eddy's research I【素数筛选法】
思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就能够了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others) ...
- SCSI miniport 驾驶一个简单的框架
前段时间,只需用一台新电脑,由于资金有限没有匹配了心仪已久的SSD.我没感觉到飞翔的感觉,总不甘心,仔细想想.我死了相当大的存储,我们可以假设部分内存作为硬盘驱动器把它弄出来.不会比固态硬盘的速度快, ...
- 【OC加强】NSDate的使用方法——日期时间在实际开发中比較有用
(1)日期的最主要知识点就是日期转换成字符串格式化输出,相反就是依照某个格式把字符串转换成日期. (2)一般关于时区的设置非常少用到,仅仅要了解就可以. #import <Foundation/ ...
- New Hire Training Experience
Game Description: 1. In a closed door, there will be a circle, and 30 numbers in the circle. 2. Each ...
- sed中求公共前缀
string1="test toast" string2="test test" printf "%s\n%s\n" "$stri ...
- oracle12c(oracle12.1.0.1.0)安装指南--实测OEL5.9(RH5)
[root@oel ora12c]# uname -a Linux oel 2.6.39-300.26.1.el5uek #1 SMP Thu Jan 3 18:31:38 PST 2013 x86_ ...
- POJ训练计划2418_Hardwood Species(Trie树)
解题报告 Tire树. #include <iostream> #include <cstring> #include <cstdio> #include < ...
- Windows 8 应用开发 - 磁贴
原文:Windows 8 应用开发 - 磁贴 我们开发的应用在Win8 界面中会以磁贴形式展现,默认情况下磁贴会显示应用图标,即项目工程中的Logo.png图片文件.开发人员可按应用的需要使 ...
- redis入门(转)
Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...