灏天阁

数据类型检测

· Yin灏

介绍除 typeof 外,另外两种方法来判断数据的类型。

使用 constructor

constructorObject 类型的原型属性,他能够返回当前对象的构造器,利用该属性,可以检测复合型数据的类型,如对象,数组,函数等。

下面代码可以检测对象和数组的类型

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

undefinednull 没有 constructor 属性,会报错。所以一般先去检测值是否为 undefinednull,然后再去调用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

toStringObject 类型的原型方法,它能够返回当前对象的字符串表示。利用该属性,可以检测复合型数据的类型,如对象,数组,函数,正则表达式,错误对象,宿主对象,自定义类型对象等;也可以对值类型数据进行检测。

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

- Book Lists -