数据类型检测
·
Yin灏
介绍除 typeof
外,另外两种方法来判断数据的类型。
使用 constructor
constructor
是 Object
类型的原型属性,他能够返回当前对象的构造器,利用该属性,可以检测复合型数据的类型,如对象,数组,函数等。
下面代码可以检测对象和数组的类型
var o = {};
var a = [];
if(o.constructor == Object) document.write("o 是对象");
if(a.constructor == Array) document.write("a 是数组");
常用数据类型检测结果
值 | typeof value |
value.constructor |
---|---|---|
var value = 1 | “number” | Number |
var value = “a” | “string” | String |
var value = true | “boolean” | Boolean |
var value = {} | “object” | Object |
var value = new Object() | “object” | Object |
var value = [] | “object” | Array |
var value = new Array() | “object” | Array |
var value = function() {} | “function” | Function |
function className() {};var value = new className() |
“object” | className |
undefined
和 null
没有 constructor
属性,会报错。所以一般先去检测值是否为 undefined
和 null
,然后再去调用constructor
。
var value = undefined;
console.log(value && value.constructor);
var value = null;
console.log(value && value.constructor);
// 数值也不能直接读取 constructor,应该先把他转换为对象再调用
console.log(10.constructor); // 抛出异常
console.log((10).constructor); // Number
console.log(Number(10).constructor); // Number
使用 toString
toString
是 Object
类型的原型方法,它能够返回当前对象的字符串表示。利用该属性,可以检测复合型数据的类型,如对象,数组,函数,正则表达式,错误对象,宿主对象,自定义类型对象等;也可以对值类型数据进行检测。
var o = {};
var a = [1,2];
var f = function() {};
console.log(o.toString()); // "[object Object]"
console.log(a.toString()); // "1,2"
console.log(f.toString()); // "function() {}"
// 测试发现,不同类型对象调用 toString() 方法时返回的字符串格式并不统一。
// 这是因为不同类型的子类在继承 Object 的原型方法 toString() 时重写了该方法。
// 如果在对象上调用 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]"
完整的数据类型检测函数
function typeOf(obj) {
var _toString = Object.prototype.toString;
var _type = {
"undefined": "undefined",
"number": "number",
"boolean": "boolean",
"string": "string",
"[object Function]": "function",
"[object RegExp]": "regexp",
"[object Array]": "array",
"[object Date]": "date",
"[object Error]": "error"
}
return _type[typeof obj] || _type[_toString.call(obj)] || (obj ? "object" : "null")
}
var _abs = Math.abs;
console.log(typeOf(_abs)); // function
console.log(typeOf({})); // object