类型识别的几种方法

类型识别方法

  • typeof
  • instanceof
  • Object.prototype.toString.call
  • constructor

typeof操作符

  • 可以识别标准类型(Null除外)
typeof 'yym'  //"string"
typeof 23  //"number"
typeof true  //"boolean"
typeof undefined  //"undefined"
typeof null  //"object"    没有识别的正确
typeof {name:'yym'}  //"object"
类型识别的几种方法_第1张图片
标准类型识别
  • 不能识别具体的对象类型(Function除外)
typeof function(){}  //"function"  这个识别是function
typeof []  //"object"
typeof new Date  //"object"
typeof /\d/  //"object"

function Person(){}
typeof new Person  //"object"
类型识别的几种方法_第2张图片
具体对象类型

instanceof

  • 能够判别内置对象类型
  • 不能判别原始类型
  • 能够判别自定义对象类型和父子类型
    • 识别所有的对象类型
能够判别内置对象类型
[] instanceof Array  //true
/\d/ instanceof RegExp  //true
new Date instanceof Date  //true

不能判别原始类型
1 instanceof Number  //false
'yym' instanceof String  //false

Object.prototype.toString.call方法

  • 可以识别标准类型以及内置对象类型
  • 不能识别自定义对象类型
Object.prototype.toString.call(123)  //"[object Number]"
Object.prototype.toString.call('yym')  //"[object String]"
Object.prototype.toString.call(true)  //"[object Boolean]"

从上面的代码中我们可以看到返回值是一个字符串当中的子字符串,我们来封装一个方法

function type(obj){
  return Object.prototype.toString.call(obj).slice(8, -1)
}
type(1)  //"Number"
type('1')  //"String"
type(true)  //"Boolean"
type(undefined)  //"Undefined"
type(null)  //"Null"

constructor 构造函数

  • 判别标准类型(Undefined/Null除外)
  • 判别内置对象类型
  • 判别自定义对象类型
判别标准类型(Undefined/Null除外)
'yym'.constructor === String  //true
(1).constructor === Number  //true
true.constructor === Boolean  //true
({}).constructor === Object  //true

判别内置对象类型
new Date().constructor === Date  //true
[].constructor === Array  //true

封装一下获取构造函数的名称

/*
* 1. 入参obj如果是undefined和null,则返回其自身;
* 2. 入参obj如果是其他值,则返回obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]的结果;
*/
function getConstructorName(obj){
    return (obj===undefined||obj===null)?obj:(obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
}

看一个类型识别的题目

/*
* 输入格式:
* '2015-08-05'
* 1438744815232
* {y:2015,m:8,d:5}
* [2015,8,5]
* 返回格式:Date
*/
function toDate(param){
  if (typeof(param) == 'string' || 
      typeof(param) == 'number' ){
    return new Date(param);
  } 
  if (param instanceof Array){
    var date = new Date(0);
    date.setYear(param[0]);
    date.setMonth(param[1]-1);
    date.setDate(param[2]);
    return date;
  }
  if (typeof(param) == 'object') {
    var date = new Date(0);
    date.setYear(param.y);
    date.setMonth(param.m-1);
    date.setDate(param.d);
    return date;
  }
  return -1;
}

你可能感兴趣的:(类型识别的几种方法)