- undefined
- boolean
- string
- number
- object
- function
constructor 判断对象的类型: [].constructor===Array
/123/.constructor===RegExp
(10).constructor === Number
但自定义的类型就不可以用这个了 function Person(name) {
this.name = name
}
var person = new Person();
person.constructor=== Person
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型 [] instanceof Array => true
[] instanceof Object => true
[] instanceof Date => false
Object.prototype.toString() 返回对象的字符串表示 因为 toString 返回的总是[object,class] 形式,object 通用类型,class 表示内部类型,所以可以使用Object.prototype.toString的方法
怎么使用呢? 因为 Array,Boolean,Number等都是Object的实例,如:Array instanceof Object 结果为true ,可以验证Array,Boolean等都复写了toString的原型方法,在调用[].toString() 实际调用的是 Array.prototype.toString()并不是Object.prototype.toString()
如: 先 delete Array.prototype.toString,再调用[].toString() 调用的才是 Object.prototype.toString()方法 delete Array.prototype.toString
console.log([].toString());
看到这大家应该明白了:改变toString的内部指针,也就是说函数的所有者(可以看之前的文章) 这不就是apply和call了吗 所以: 可以这样写Object.prototype.toString.call(obj) 当然apply也是可以的 我们就可以封装下面的函数用于类型判断 function typeOf(obj) {
var typeList = {
'[object Boolean]' : 'boolean',
'[object Number]' : 'number',
'[object String]' : 'string',
'[object Function]' : 'function',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object RegExp]' : 'regExp',
'[object Undefined]': 'undefined',
'[object Null]' : 'null',
'[object Object]' : 'object'
};
return typeList [Object.prototype.toString.call(obj)];
}
|