Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型。基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型,object是复杂数据类型,其中Object,Array,Function属于引用类型(对象数据类型)。

基于这么多数据类型,所以JS就自带有类型判定的方法,typeof  用来检测基本数据类型,instanceof 用来检测对象数据类型,但是JS自带的这两套识别机制并不靠谱,所以产生了isXXX一系列来判断数据类型的方法,就拿typeof来说,他只能粗略的识别出string、number、boolean、function、undefined、object这6中数据类型,无法识别Null,RegExpAragument等细分对象类型

     /*
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型。基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型,
object是复杂数据类型,其中Object,Array,Function属于引用类型(对象数据类型)。基于这么多数据类型,所以JS就自带有类型判定的方法,typeof 用来检测基本数据类型,
instanceof 用来检测对象数据类型,但是JS自带的这两套识别机制并不靠谱,所以产生了isXXX一系列来判断数据类型的方法,就拿typeof来说,
他只能粗略的识别出string、number、boolean、function、undefined、object这6中数据类型,无法识别Null,RegExpAragument等细分对象类型
*/
//下面就是自带的Js识别系统所带的坑 console.log(typeof null);//输出:object
console.log(typeof document.childNodes);//safari 输出:function
console.log(document.createElement("embed"));//ff3-10 输出:function,其他浏览器都输出object
console.log(document.createElement("object"));//ff3-10 输出:function,其他浏览器都输出object
console.log(document.createElement("applet"));//ff3-10 输出:function,其他浏览器都输出object
console.log(typeof /\d/i);//在实现了ecma262v4的浏览器上输出:function
console.log(typeof window.alert);//IE678 输出:object, 其他浏览器输出:function
//以上就是typeof的坑 var iframe=document.createElement("iframe");
document.body.appendChild(iframe);
xArray=window.frames[window.frames.length-1].Array;
var arr=new xArray(1,2,3);
console.log(arr);//输出:1,2,3
console.log(arr instanceof Array);//输出:false
console.log(arr.constructor===Array);//输出:false
//以上是instnceof的坑,只要原型上存在此对象的构造函数,那么就返回true,但是如果跨文档比较,iframe里面的数组实例就不是父窗口里面的Array的实例 window.onload=function () {
console.log(window.constructor);//IE67 undefined 其他object
console.log(document.constructor);//IE67 undefined 其他object
console.log(document.body.constructor);//IE67 undefined 其他object
console.log((new ActiveXObject("Microsoft.XMLHttp")).constructor);//IE6789 undefined
}
//以上是constructor的坑,产生以上问题的原因是在旧版本IE下DOM和BOM是没有暴露出来的 console.log(isNaN("aaa"));//输出:true
console.log(isNaN(new Object()));//输出:true
//isNaN这个方法非常不靠谱,当我们传入字符串和对象时,输出也是true,这对我们的序列化是非常不利的 if(typeof window.ActiveXObject!="undefined")
{
var xhr=new ActiveXObject("Msxml2.XMLHTTP");
console.log(typeof xhr.abort);//输出:unknown
}
//以上是在IE下的typeof返回unknown的情况 /*
之前大多数人用document.all是否存在来判定IE,因为用document.all来取得页面中的元素是不错的注意,但是这个方法其他浏览器也觊觎了好久,
于是就有了Chrome下的闹剧
*/
console.log(typeof document.all); //IE78中输出:object,在Chrome中输出:undefined
console.log(document.all);//在Chrome中,虽然typeof输出的是:undefined,但是document.all却能获取到所有的网页元素,输出:HTMLAllCollection[6]
   /*
以下是jQuery判断js数据类型的方法$.type
*/
var jQuery={};
var class2Type={};
var dataType=["Boolean","Number","String","Function","Array","Date","RegExpObject","Function"];
for(var i=0;i<dataType.length;i++)
{
class2Type["[object "+dataType[i]+"]"]=dataType[i].toLowerCase();
}
jQuery.type=function (obj) {
return obj==null?obj+"":class2Type[Object.prototype.toString.call(obj)] || "object";
} var aa=false;
function bb(){}
alert(Object.prototype.toString.call(aa))//输出:[object Number]
alert(jQuery.type(bb))//输出:number
    var mass={};
var class2Type={
"[objectHTMLDocument]":"Document",
"[objectHTMLCollection]":"NodeList",
"[objectStaticNodeList]":"NodeList",
"[obejctIXMLDOMNodeList]":"NodeList",
"[objectDOMWindow]":"Window",
"null":"Null",
"NaN":"NaN",
"undefined":"Undefined"
}
var toString=class2Type.toString;
var AllDataType=["Boolean","Number","String","Function","Array","Date","RegExp","Error","Symbol","Arguements","Window","Document"];
//填充class2Type集合用于判断js数据类型,通过Object.prototype.toString.call()来判断解决typeof和instanceof"不靠谱"的问题
//class2Type这个映射几乎将所有的对象类型一网打尽
for(var i=0;i<AllDataType.length;i++)
{
class2Type["[object "+AllDataType[i]+"]"]=AllDataType[i];
}
mass.type=function (obj,str) {
//1、当传入的对象不等于null或者自己的类型不等于自己的时候,直接去class2Type中找自己的类型,
// 2、如果找不到做Object.prototype.toString转换,再去class2type中找
//3、如果在class2type中找不到类型,那么找传入对象的nodeName(传入的参数可能是html元素节点)
//4、如果上面的条件都不满足那么就把result设为"#"
var result=class2Type[(obj==null || obj!==obj?obj:toString.call(obj))] || obj.nodeName || "#";
//兼容旧版本浏览器处理个别情况,如window,opera
//利用IE678中window==document为true,document==window为false的神奇特性
if(result.charAt(0)=="#")
{
if(obj==obj.document && obj.document!=obj)
{
result="Window";
}
else if(obj.nodeType===9)
{
result="Document";
}
else if(obj.callee)
{
result="Arguements";
}
else if(isFinite(obj.length) && obj.item)
{
result="NodeList";
}else
{
result=toString.call(obj).slice(8,-1);
}
}
if(str)
{
return str===result;
}
return result;
}
//type方法直接用toString.call(obj)做键,直接从事先存好的映射中取出。只有在IE6、IE7、IE8中才废一些周折处理window、document
//Arguement、nodeList等模块

JS框架设计之对象类型判断一种子模块的更多相关文章

  1. JS框架设计之对象数组化一种子模块

    类数组对象是一个很好的存储结构,但是功能太弱了,为了享受纯数组的哪些便捷的方法,使用前可以做下转换,通常可以使用$.slice.call()方法做转换,但是旧版本的IE下的HTMLCollection ...

  2. js框架设计1.4类型判断

    这篇司徒大神介绍了很多js的 不靠谱类型判断.篇幅也是第一篇中最常的 ,经阅读后,以后一定要用框架的自带的类型判断,万万不可随便乱用js原生判断.

  3. JS框架设计之对象扩展一种子模块

    对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功能,将新添加的功能整合到我们定义的对象中 ...

  4. js对象类型判断工具

    对象类型判断工具 /** *类功能:对象类型判断工具 **/ var TypeUtil = { /** *方法说明:是否是数组 **/ isArray: function (obj) {//是否是数组 ...

  5. js框架设计1.1命名空间笔记

    借到了司徒正美的写的js框架设计一书,司徒大神所著有些看不太懂,果然尚需循序渐进,稳扎js基础之中. 第一张开篇司徒阐述了种子模块的概念 种子模块亦为核心模块,框架最先执行模块,司徒见解应包含:对象扩 ...

  6. JS框架设计之命名空间设计一种子模块

    命名空间 1.种子模块作为一个框架的最开始,除了负责初始化框架的最基础部分. 2.种子模块作为框架的最开始,那么什么是种子框架的最开始呢?答案是IIFE(立即调用函数表达式); IIFE(立即调用函数 ...

  7. JS框架设计读书笔记之-小知识

    这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...

  8. JS框架设计读书笔记之-核心模块

    随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...

  9. JavaScript进阶内容1:各种对象类型判断

    该文章主要用来介绍JavaScript中常用的一些对象检测判断方法,整理资源来自书本和网络,如有错误或说明不详之处,望评论提出,本菜定提名感谢……(本文章知识比较基础,大牛请提些意见再绕道,三克油^_ ...

随机推荐

  1. UVa 10118 Free Candies (记忆化搜索+哈希)

    题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...

  2. Linux系统下安装ncurses库

    ncurses库是一个Linux系统下的图形支持的函数库,字符终端处理库,包括面板和菜单. 今天在安装ncurses库的时候遇到了一些问题,现将遇到的问题所叙如下: 首先说明:本次安装采用的是源码包的 ...

  3. ui-router 之 $state.go

    Ui-router 之 $state.go   $state.go(arg1,arg2,arg3),有三个参数:第一个参数是你需要跳转的完整路由:第二个参数是query,当然不需要query,直接写{ ...

  4. 自我介绍和Github的初次体验

    姓名:袁宇鹏    学号:1413042045    班级:网络工程142    兴趣爱好:篮球,看书 写过的代码:用C++写过,只能算是看看这源程序修改. 没有开发过任何程序 Github使用流程: ...

  5. mysql导入数据load data infile用法(转)

    们常常导入数据!mysql有一个高效导入方法,那就是load data infile 下面来看案例说明 基本语法: load data  [low_priority] [local] infile ' ...

  6. asp.net——上传图片生成缩略图

    上传图片生成缩略图,原图和缩略图地址一样的时候缩略图会把原图覆盖掉 /// <summary> /// 生成缩略图 /// </summary> /// <param n ...

  7. 【ocp-12c】最新Oracle OCP-071考试题库(38题)

    38.choose the best answer View the Exhibit and examine the data in the PROMOTIONS table. PROMO_BEGIN ...

  8. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  9. Qt5学习笔记(控件)

    上面的程序仅仅可以显示一个 大概 的界面,对其进行单击等操作,界面仅有一些简单的反应,对应的程序不能得知界面有什么改变(是否进行单击选择,文本框中是否有文字输入) 下面对程序进行完善. T05Cont ...

  10. Linux(Ubuntu)配置问题集

    Cannot set LC_CTYPE to default locale: No such file or directory 安装Ubuntu Server版本(不带桌面环境)时,如果安装时的语言 ...