-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
说说几种判断数据类型的方法,并说说其中各自的优缺点。 #34
Comments
常用判断类型的方法主要有 typeof
关于 instanceof检测某个实例是否隶属于该类,使用方法 ++ 不足点:
底层原理:
var instacne_of = function instance_of(instance, constructor) {
var instance_type = typeof instance,
constructor_type = typeof constructor;
// 判断构造函数是否是一个函数
if (!/^function$/i.test(constructor_type) && !constructor.prototype) {
throw new TypeError('constructor 必须为一个具有 prototype 的函数');
}
// 不处理原始值
if (!/^object|function$/i.test(instance_type)) return false;
// 判断 null
if (instance === null) return false;
// 判断是否具有 [Symbol.hasInstance] 方法
if (typeof constructor.prototype[Symbol.hasInstance] === 'function') {
return constructor.prototype[Symbol.hasInstance](instance);
}
// 如果没有则基于原型链查找
// 获取当前实例的原型
let prototype = Object.getPrototypeOf(instance);
while (prototype) {
if (prototype === constructor.prototype) return true;
// 更新 prototype,知道找到 constructor 的原型或者 null 为止
prototype = Object.getPrototypeOf(prototype);
}
return false;
}; constructor
Object.prototype.toString
其中一些类自身的都具有 可以看看著名的 JQuery 的源码中有一个数据类型检测就是借用它来封装的。 var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty; 填充 class2type 表jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
} ); 添加数据类型检测拓展方法jQuery.extend({
// 判断是否是数组
isArray: Array.isArray,
// 判断是否是 window 对象
isWindow: function( obj ) {
return obj != null && obj === obj.window;
},
// 判断是否是数字
isNumeric: function( obj ) {
var realStringObj = obj && obj.toString();
return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
},
// 判断是否是纯对象
isPlainObject: function( obj ) {
var key;
if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
// 如果构造函数中没有这些属性就返回 false
if ( obj.constructor &&
!hasOwn.call( obj, "constructor" ) &&
!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
return false;
}
//首先枚举自己的属性,以便加快速度,
//如果最后一个是拥有的,那么所有属性都是拥有的
for ( key in obj ) {}
return key === undefined || hasOwn.call( obj, key );
},
// 判断是否是空对象
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
// 判断类型
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call( obj ) ] || "object" :
typeof obj;
},
}) 判断是否是类数组function isArrayLike( obj ) {
var length = !!obj && "length" in obj && obj.length,
type = jQuery.type( obj );
if ( type === "function" || jQuery.isWindow( obj ) ) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
} |
No description provided.
The text was updated successfully, but these errors were encountered: