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. dedecms友情链接flink的调用方法

    标记名称:flink[标签简介][功能说明]:用于获取友情链接,其对应后台文件为"includetaglibflink.lib.php".[适用范围]:全局标记,适用V55,V56 ...

  2. ubuntu12.04 安装 ruby1.9.3

    sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update sudo apt-get install ruby rubygems ...

  3. django解决跨域请求的问题

    跨域请求可以用jsonp来解决,不过今天我发现一个很好用的包:django-cors-headers 只需要简单地配置一下就可 被请求方的setting.py中的配置如下: INSTALLED_APP ...

  4. excel筛选两列值是否相同,如果相同返回第三列值

    见图:

  5. 《Programming WPF》翻译 第3章 3.内嵌控件

    原文:<Programming WPF>翻译 第3章 3.内嵌控件 WPF提供了一系列内嵌控件.其中大多数符合标准的你已经熟悉的Windows控件类型.注意到没有一个是包装在旧的Win32 ...

  6. yii基础知识-应用

    应用是指请求处理中的执行上下文.它的主要任务是分析用户请求并将其分派到合适的控制器中以作进一步处理. 它同时作为服务中心,维护应用级别的配置.鉴于此,应用也叫做前端控制器. 应用由 入口脚本 创建为一 ...

  7. [置顶] Android四大组件之BroadcastReceiver

    Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...

  8. device tree website

    每一个设备都有相对应的初始化程序,dts的写法可以参照Documentations/devicetree/下面的文档 http://bbs.chinaunix.net/thread-4139331-1 ...

  9. 【HDU1162】Eddy's picture(MST基础题)

    很基础的点坐标MST,一不留神就AC了, - - !! #include <iostream> #include <cstring> #include <cstdlib& ...

  10. ofbiz ins