最近在做知识整理,把自己从前看过的东西做了分类和处理,希望可以形成自己的知识管理库。从前习惯用笔记本这种传统方式来记笔记,但最近发现要记的东西越来越多了之后,这种方式的效率越来越低,并且不利于维护和管理。听朋友说百度脑图(一款在线的思维导图软件)不错,用了之后觉得除了频繁弹出'500出错了'这件事儿,其他各方面还算满意,进入正文啦。
今天来谈谈判断数据类型的几种方法及每种方法的应用场景分析。个人能力有限,说的不对的地方欢迎指出,不要打我就好。先上图:
一、typeof操作符判断数据类型
typeof返回的字符串(能够判断的数据类型)
'string'
'number'
'boolean'
'object':如果这个值是对象或者null(因为null被认为是一个空对象)
'function':这个值是函数
因此可判断基本的数据类型,但无法判断引用类型(除了function类),也就是继承自object类型的具体类型,比如Array、Date、自定义类等。
特殊情况:
typeof null // 'object'
typeof 未声明的变量/已声明未初始化的变量 // 'undefined'
二、instanceof操作符判断数据类型
a istanceof A :判断a是否是A的实例,其实是在判断a._proto_ === A.prototype,所以用这种方法判断数据类型存在一个问题,举例来说:
var arr = [];
arr instanceof Array // true
arr instanceof Object // true
原因:
arr._proto_ === Array.prototype;
Array.prototype._proto_ === Object.prototype;
Object.prototype._proto_ === null;
基于原型链的查找机制。
因此,我们用 instanceof 也不能完全精确的判断object类的具体数据类型。
确定原型和实例的关系还可以用isPrototypeOf()方法,跟instanceof类似,只要是原型链中出现过的原型都是该实例的原型。
使用instanceof判断数据类型还存在一个问题。当instanceof存在多个全局执行环境的情况下时会出现问题。比如网页中包含多个框架或者多个frame的情况。
三、Arrary.isArray()方法判断是否为数组
这是S5中新增的数组方法,用来检测数组类型。但在IE9以下浏览器不支持。可以解决当网页存在多个全局执行环境下用instanceof操作符判断类型的问题。
var arr = [];
Array.isArray(arr); //true
四、Object.prototype.toString.call()精确判断数据类型
可以用来精确判断数据类型,包括Boolean、Number、String、Function、Array、Date、RegExp、Object、Error等类型。返回类似’[object type]‘的字符串,type指前面提到过的Boolean、String等类型。
缺点:无法检测开发人员自定义的构造函数创建的实例类型。
如:
function Person(name){
this.name = name;
}
var p1 = new Person('san');
Object.prototype.toString.call(p1) //'[object Object]'