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 ...
随机推荐
- Python每隔一秒钟打印当地时间
import threading,time global t def sayHello(): print time.strftime('%Y-%m-%d %H:%M:%S',time.localtim ...
- pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程)
在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread ...
- uva 11722 - Joining with Friend(概率)
题目连接:uva 11722 - Joining with Friend 题目大意:你和朋友乘火车,而且都会路过A市.给定两人可能到达A市的时段,火车会停w.问说两人能够见面的概率. 解题思路:y = ...
- Mac OS X在建筑Python科学计算环境
经验(比如这篇日志:http://blog.csdn.net/waleking/article/details/7578517).他们推荐使用Mac Ports这种软件来管理和安装全部的安装包.依照这 ...
- 安装配置gerrit
Centos 安装配置gerrit 关闭selinux,不然nginx的反向代理会报错connect() to 127.0.0.1:8080 failed (13: Permission denied ...
- Hibernate操作Clob数据类型
在POJO字符串可以声明为一个大型对象java.lang.String要么java.sql.Clob种类. 当程序从数据库加载Clob数据的类型.负荷只有一个Clob数据的逻辑指针类型.我们需要通过使 ...
- 初识google多语言通信框架gRPC系列(一)概述
gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...
- iOS Foundation 框架基类
iOS Foundation 框架基类 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...
- MySQL 最经常使用的一千行
/* 启动MySQL */ net start mysql /* 连接和断开server */ mysql -h 住址 -P port -u username -p password /* 跳过许可认 ...
- 修改字符串中特定的内容,用于OpenRecovery Script
下面的是实例内容 目标是把OpenRecovery Script输入的内容进行修改 当有下面的输入:(作用是安装/emmc目录下面的update-signed.zip 刷机包) install /em ...