A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  • 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)];
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马