1.首先定义一个关于类型的对象,及相关变量

类型判断对象

ar L = Y.Lang || (Y.Lang = {}),

STRING_PROTO = String.prototype,
TOSTRING = Object.prototype.toString, TYPES = {
'undefined' : 'undefined',
'number' : 'number',
'boolean' : 'boolean',
'string' : 'string',
'[object Function]': 'function',
'[object RegExp]' : 'regexp',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object Error]' : 'error'
},

//L是YUI内部的一个命名空间
2.在此基础上定义一个类型判断的函数,返回传参的类型

类型判断

L.type = function(o) {
return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};

// L.type返回一个类型,会类型对象中查找 || 调用 tostring查找  || 如果上述都没有且存在,那返回的就是一个对象  ||  null

3. 定义一个识别是否为原生函数的函数(主要针对ES5)

用正则检测是否原生函数

NATIVE_FN_REGEX  = /\{\s*\[(?:native code|function)\]\s*\}/i;
L._isNative = function (fn) {
return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
};
//若是原生函数会返回  function 函数名() { [native code ] }
// 如果配置中选择不使用ES5的方法,会全部使用重写的方法

4. 检测各种类型的函数

类型检测函数L.isArray = L._isNative(Array.isArray) ? Array.isArray : function (o) {
return L.type(o) === 'array';
};
L.isBoolean = function(o) {
return typeof o === 'boolean';
};
L.isDate = function(o) {
return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
};
L.isFunction = function(o) {
return L.type(o) === 'function';
};
L.isNull = function(o) {
return o === null;
};
L.isNumber = function(o) {
return typeof o === 'number' && isFinite(o);
};
//对象检测,若failfn为false,function传入返回true,否则返回false
L.isObject = function(o, failfn) {
var t = typeof o;
return (o && (t === 'object' ||
(!failfn && (t === 'function' || L.isFunction(o))))) || false;
};
L.isString = function(o) {
return typeof o === 'string';
};
L.isUndefined = function(o) {
return typeof o === 'undefined';
};
L.isValue = function(o) {
var t = L.type(o); switch (t) {
case 'number':
return isFinite(o); case 'null': // fallthru
case 'undefined':
return false; default:
return !!t;
}
};
L.now = Date.now || function () {
return new Date().getTime();
};

//new Date() 如果传参是一个非法的:

//  第一种情况,传参全部是字母,在IE9,chrome,ff,opera,safari返回Invalid Date,  IE6-IE8返回一个NaN;
//  第二种情况,传参有一部分是数字,在chrome会自己创建 一个正确的时间,其余的与第一种情况一样;

// 因此检测一个对象是否是日期对象 必须检测3项,如果全部满足就是正确的日期对象

//safari中 typeof(document.getElementsByTagName(‘a’) => ‘function’

//isValue  检测一个值不为NaN,undefined, ‘ ’

5.应用,扩展三个函数,用于去除前后的空格

去除空格正则表达式UBREGEX         = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g

WHITESPACE       = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF"
WHITESPACE_CLASS = "[\x09-\x0D\x20\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+"
TRIM_LEFT_REGEX = new RegExp("^" + WHITESPACE_CLASS)
TRIM_RIGHT_REGEX = new RegExp(WHITESPACE_CLASS + "$")
TRIMREGEX = new RegExp(TRIM_LEFT_REGEX.source + "|" + TRIM_RIGHT_REGEX.source, "g")

去除空格正则表达式L.trim = L._isNative(STRING_PROTO.trim) && !WHITESPACE.trim() ? function(s) {
return s && s.trim ? s.trim() : s;
} : function (s) {
try {
return s.replace(TRIMREGEX, '');
} catch (e) {
return s;
}
};
//return s && s.trim ? s.trim() : s 确保是字符串,如果不是字符串,直接返回s
L.trimLeft = L._isNative(STRING_PROTO.trimLeft) && !WHITESPACE.trimLeft() ? function (s) {
return s.trimLeft();
} : function (s) {
return s.replace(TRIM_LEFT_REGEX, '');
}; L.trimRight = L._isNative(STRING_PROTO.trimRight) && !WHITESPACE.trimRight() ? function (s) {
return s.trimRight();
} : function (s) {
return s.replace(TRIM_RIGHT_REGEX, '');
};

6. 关于类型判断的一些注意点

a.  safari中关于元素收集集合类型的判断问题

函数var a = document.getElementsByTagName('a')
var b = document.getElementsByClassName('cnblogs_code')
var c = document.getElementById('cnblogs_post_body')
//对a,b,c进行typeof运算
console.log(typeof a)
console.log(typeof b)
console.log(typeof c)
//safari中前两个是function,最后一个是object,其余浏览器全是object

b. IE8以下对一些函数认为是'object‘

IEvar a = document.getElementsByTagName('html')[0]
var input = document.createElement("input");
console.log(typeof a.getAttribute)
console.log(input.focus)
//IE8及以下的会是object

YUI的类型判断函数的更多相关文章

  1. JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集

    工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outil ...

  2. PHP常用类型判断函数

    1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...

  3. PHP常用类型判断函数总结

    1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...

  4. 实现一个类型判断函数,需要鉴别出基本类型、function、null、NaN、数组、对象?

    只需要鉴别这些类型那么使用typeof即可,要鉴别null先判断双等判断是否为null,之后使用typeof判断,如果是obejct的话,再用Array.isArray判断是否为数组,如果是数字再使用 ...

  5. 021-PHP常用的数值类型判断函数

    <?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...

  6. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

  7. 类型和原生函数及类型转换(二:终结js类型判断)

    typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...

  8. python的数据结构分类,以及数字的处理函数,类型判断

    python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...

  9. Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈

    python内建数据结构 分类 数值型: int float complex bool 序列对象: 字符串str 列表list 元组tuple 键值对: 集合set 字典dict 数值型 (list ...

随机推荐

  1. JQuery中parents和closest的区别

    jquery中查找上层元素一般都习惯了用parents方法,往往忽略了还有一个效率更高的closest方法,看下w3cschool的解释 过程不一样,closest是找到一个即停止,而parents将 ...

  2. mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

    从字面的意思上说:这个函数要被弃用,请使用 mysqlli 或者是 PDO 代替 然后就查手册发现没说,大家一定要查官方最新的手册

  3. 第一个程序 - Windows程序设计(SDK)001

    愉快的开始 让编程改变世界 Change the world by program 编译器安装 我们经常说的 VS 指的就是 Microsoft Visual Studio 的简称,它是微软开发工具的 ...

  4. HoG SVM 目标检测分析

    前一段时间开始了解HoG跟SVM行人识别,看了很多包括Dalal得前辈的文章及经验分享,对HoG理论有了些初步的认识. HoG 的全称是 Histogram of Oriented Gradient, ...

  5. WordPress插件开发记录

    1.a标签在新的网页中打开内容     <a href="网址" target="_blank"></a>      2.PDO的$re ...

  6. 开心学习系列学习笔记-----nodejs缺点

    不支持故障恢复   不知你是否在调试的过程中注意,当程序有错误发生时,整个进程就会结束,需要重  新在终端中启动服务器.这一点在开发中无可厚非,但在产品环境下就是严重的问题  了,因为一旦用户访问时触 ...

  7. ADT 连接手机运行android应用程序时报错

    The connection to adb is down, and a severe error has occured.    You must restart adb and Eclipse.  ...

  8. JVM性能调优博客

    http://houjixin.blog.163.com/blog/static/35628410201411275719843/ http://blog.csdn.net/lastsweetop/a ...

  9. 深入浅出Node.js (6) - 理解Buffer

    6.1 Buffer结构 6.1.1 模块结构 6.1.2 Buffer对象 6.1.3 Buffer内存分配 6.2 Buffer的转换 6.2.1 字符串转Buffer 6.2.2 Buffer转 ...

  10. WebDriver使用IE浏览器

    开始使用Selenium2之后就一直在用FireFox,因为文章上都说webdriver对firefox支持的最好,同时也很好上手,试了一下就可用了,也就没再用其他浏览器,不过最近遇到了一个问题,是我 ...