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