YUI的类型判断函数
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的类型判断函数的更多相关文章
- JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集
工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outil ...
- PHP常用类型判断函数
1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...
- PHP常用类型判断函数总结
1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...
- 实现一个类型判断函数,需要鉴别出基本类型、function、null、NaN、数组、对象?
只需要鉴别这些类型那么使用typeof即可,要鉴别null先判断双等判断是否为null,之后使用typeof判断,如果是obejct的话,再用Array.isArray判断是否为数组,如果是数字再使用 ...
- 021-PHP常用的数值类型判断函数
<?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...
- javascript学习-类型判断
javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...
- 类型和原生函数及类型转换(二:终结js类型判断)
typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...
- python的数据结构分类,以及数字的处理函数,类型判断
python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...
- Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈
python内建数据结构 分类 数值型: int float complex bool 序列对象: 字符串str 列表list 元组tuple 键值对: 集合set 字典dict 数值型 (list ...
随机推荐
- 慕课linux学习笔记(八)常用命令(5)
解压缩命令 常用压缩格式 .zip .gz .bz2 .tar.gz .tar.bz2 zip [压缩文件名] [ 原文件 ] #压缩文件 -r [压缩文件名] [ 源目录] #压缩目录 -r [压缩 ...
- 有关service
在symfony2 服务注入容器的时候参数语法可以是这样: cellcom.twig.menu_extension: class: Cellcom\WebBundle\Twig\Extension\M ...
- CSU 1335 高桥和低桥
开始队友说是线段树,看了看貌似也是,上手敲了个嵌套的线段树,O(nlognlogn)的复杂度果断tle了 TAT 思路:对h[i]排序,对每次涨水退水,先用二分查找,再用一个数组保存当前点之后所有点被 ...
- ORA-19573: cannot obtain exclusive enqueue for datafile 1
还原Oracle数据库时出现ORA-19870和ORA-19573错误,如: RMAN> restore database; Starting restore at 11-DEC-12 usin ...
- hdu 1596 find the safest road
http://acm.hdu.edu.cn/showproblem.php?pid=1596 #include <cstdio> #include <cstring> #inc ...
- CoFun 1616 数字游戏
Description 一个数x可以按以下规则生成数字: 1.将任意两位交换,若交换的数字为a和b,生成的代价为((a and b)+(a xor b))*2 . 例如134可以生成431,因为431 ...
- ps2keyboard demo code for 8052
#pragma code symbols debug objectextend #include <reg51.h> /* special function register declar ...
- Android得到控件在屏幕中的坐标
getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标 getLocationInWi ...
- 用VS2013+VELT进行Linux开发
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 1.1.1 什么是 ...
- Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入
原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...