常见的检测方法
1、typeof value
typeof返回数据类型的字符串
例如:"number"、"string"、"boolean"、"undefined"、"function"、 "symbol"
除了上面几种类型,剩下的都会返回object
注意:
1、对未声明和未初始化执行typeof都返回undefined
2、instanceof
instanceof用于检测变量是否是给定引用类型的实例
例如: a instanceof Object/ a instanceof Array /a instanceof RegExp
- 所有引用类型都是object的实例
- instanceof检测基本类型都是false
- 用instanceof检测的时候,只要当前的这个类在实例的原型链上(可以通过原型链proto找到它),检测出来的结果都是true
3、constructor
用法类似于instanceof ,在类继承的时候会出错
例如:
- function A(){};
function B(){};
A.prototype = new B(); //A继承自B
var aObj = new A();
alert(aobj.constructor === B) -----------> true;
alert(aobj.constructor === A) -----------> false;
alert(aobj instanceof B) ----------------> true;
alert(aobj instanceof B) ----------------> true;
言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:
aobj.constructor = A;
alert(aobj.constructor === A) ----------->true;
alert(aobj.constructor === B) ----------->false;
4、通用的prototype方法
var a = 1;
Object.prototype.toString.call(a)
"[object Number]"
var a = "1";
Object.prototype.toString.call(a)
"[object String]"
var a = null;
Object.prototype.toString.call(a)
"[object Null]"
var a = undefined;
Object.prototype.toString.call(a)
"[object Undefined]"
var a = true;
Object.prototype.toString.call(a)
"[object Boolean]"
var a = {};
Object.prototype.toString.call(a)
"[object Object]"
var a = function(){};
Object.prototype.toString.call(a)
"[object Function]"
var a = [1,2,3];
Object.prototype.toString.call(a)
"[object Array]"
5、query.type()
类似于peototype.toString.call(), 返回的结果是undefinded, null ,array,function, boolean, number, object等
4和5的原理
- 在toString方法被调用时,会执行下面的操作步骤:
如果this的值为undefined,则返回"[object Undefined]".
如果this的值为null,则返回"[object Null]".
让O成为调用ToObject(this)的结果.
让class成为O的内部属性[[Class]]的值.
返回三个字符串"[object ", class, 以及 "]"连接后的新字符串- 所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是除了"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"之外的的任何字符串.[[Class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值
网友评论