typeof对于每一种基本类型都有不一样的返回值,可是对于全部的引用类型都只返回'object'浏览器
注意:对于Null类型返回'object',对于特殊的引用类型Function返回'function'安全
Undefined类型: 'undefined' Boolean类型: 'boolean' String类型: 'string' Number类型: 'number' 引用类型/Null类型: 'object' Function类型: 'function'
instanceof 操做符用来判断左表达式的原型链里有没有右表达式的原型。函数
所以在必定状况下能够用来做为引用类型的检测方法。spa
好比,对于某个regexp实例a,利用instanceof来检测:a._proto_为RegExp.prototype;RegExp.prototype为RegExp.prototype,两个值相等,返回trueprototype
Javascript instanceof 运算符源码code
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式 var O = R.prototype;// 取 R 的显示原型 L = L.__proto__;// 取 L 的隐式原型 while (true) { if (L === null) return false; if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true return true; L = L.__proto__; } }
在利用instanceof来进行类型检测时,左表达式为检测对象,右表达式为须要检测的引用类型的构造函数regexp
Object Array Function Date RegExp Function Global Math //如下为基本类型的显示构造函数,这些构造函数的实例不是基本类型。 Boolean Number String
注:Global对象是兜底的对象,全部全局变量和全局函数都是Global对象的属性,Global对象的属性有各类原生的构造函数,还有三个特殊值NaN,undefined,Infinity。 window对象是Global对象的浏览器实现,可是window对象包含更多的原生属性。对象
instanceof类型检测的缺点ip
instanceof的左右表达式必须知足在同个全局做用域中,由于不一样全局做用域的构造函数的prototype属性不是同一个对象,好比在frame1中的Array.prototype与frame2中的Array.prototype就不是一个对象。原型链
Object.protptype.toString.call(value)
在任何值上调用Object.prototype.toString,都会返回一个[object NativeConstructorName]的字符串。
好比:
var a = [] console.log(Object.prototype.toString.call(a)); //'[object Array]'
对于上文提到的全部类型以及JSON类型,这个方法都会返回不一样的字符串(NativeConstructorName以大写字母开头),因此这是一个类型检测的好方法。