类型识别的几种方法
2017-08-28 本文已影响25人
YM雨蒙
类型识别方法
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"
标准类型识别
不能识别具体的对象类型(Function除外)
typeof function(){} //"function" 这个识别是function
typeof [] //"object"
typeof new Date //"object"
typeof /\d/ //"object"
function Person(){}
typeof new Person //"object"
具体对象类型
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;
}