■知识点
在对象上调用Object的原型方法toString(),就会返回统一格式的字符串表示。例如:
var _toString = Object .prototype. toString; //引用Object 的原型方法 toString ()
//使用apply方法在对象上动态调用Object的原型方法toString ()
console. log ( _toString.apply ( o )); //表示为"[object Object]"
console. log ( _toString.apply ( a )); //表示为"[object Array]"
console. log ( _toString.apply ( f )); //表示为"[object Function]"
仔细分析不同类型对象的toString()方法返回值,会发现由Object的原型方法toString()直接返回的字 符串的格式如下:
[object Class]
其中,object表示对象的基本类型,Class表示对象的子类型,子类型的名称与该对象的构造函数名一一对应。例如,Object 对象的Class 为 Object, Array 对象的 Class 为 Array,Function 对象的 Class 为 Function, Date 对象的 Class 为 Date,Math 对象的 Class 为 Math,Error 对象(包括 Error 子类)的 Class 为Error等。
宿主对象也有预定的Class值,如Window、Document和Form等。用户自定义的对象的Class为 Object。用户自定义的类型,可以根据这个格式自定义类型表示。
Class值提供的信息与constructor属性值都能够检测数据类型,但是Class值是以字符串的形式提供这些信息,这在开发环境中是非常有用的。而使用typeof运算符进行类型检测,由于其返回的字符串表示比较有限,无法准确分辨Object、Function和Army等类型。
■实例设计
设计typeOfO方法,利用其返回的数据类型的字符串表示,可以设计一种更安全、更强健的类型检测方法。
function typeOf(obj){
var str = Object.prototype.toString.call(obj);
return str.match(/\[object (.*?)\]/) [1].toLowerCase();
};
console.log( typeOf({}) ) ; //"object"
console.log( typeOf([]) ); //"array"
console.log( typeOf(0) ); //"number"
console.log( typeOf(null)); //"null"
console.log( typeOf(undefined)); //"undefined"
console.log( typeOf(/ /)); //"regex"
console.log( typeOf(new Date()));//"date"
在上面检测的函数中,模拟typeof运算符的返回值格式,设计所有类型返回的字符串表示都以小写 的单个词来表示。
在typeOfO方法的基础上扩展方法,专门检测某种类型数据。
['Null','Undefined', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'RegExp'].forEach(function (t) {
typeOf['is' + t] = function (o) {
return typeOf(o) === t.toLowerCase ();
};
});
console.log( typeOf.isObject({}) ); //true
console.log( typeOf.isNumber(NaN) ); //true
console.log( typeOf.isRegExp(true) ); //false
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>