1、typeof 用来检测数据类型的运算符
typeof value
->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"、"string"、"boolean"、"undefined"、"object"、"function"
->局限性:
1)typeof null ->"object"
2)检测的不管是数组还是正则都返回的是"object",所以typeof不能判断一个值是否为数组
->console.log(typeof typeof typeof [12, 23]);//->"string" 两个或者多个typeof一起使用时,返回值一定是"string";
2、instanceof/constructor
我们使用instanceof/constructor可以检测数组和正则
console.log([] instanceof Array)//true
console.log(/^$/ instanceof RegExp)//true
console.log([] instanceof Object)//true
console.log([].constructor===Array)//true
console.log([].constructor===Object)//false 我们的constructor可以避免instanceof检测的时候,用Object也是true的问题
console.log({}.constructor===Object)//true
局限性:
1)用instanceof检测的时候,只要当前的这个类在实例的原型链上(可以通过原型链__proto__找到它),检测出来的结果都是true
var oDiv = document.getElementById("div1");
//HTMLDivElement->HTMLElement->Element->Node->EventTarget->Object
console.log(oDiv instanceof HTMLDivElement);//->true
console.log(oDiv instanceof Node);//->true
console.log(oDiv instanceof Object);//->true
2)基本数据类型的值是不能用instanceof来检测的
->console.log(1 instanceof Number);//->false
数组创建的两种方式(对象、正则、函数...)
->对于引用数据类型来说,我们两种方式创建出来的都是所属类的实例,而且都是对象数据类型的值,是没有区别的
var ary = [];
var ary = new Array;
->对于基本数据类型来说,虽然不管哪一种方式创建出来的都是所属类的一个实例(在类的原型上定义的方法都可以使用),但是字面量方式创建出来的是基本数据类型,而实例方式创建出来的是对象数据类型
var num1 = 1;
var num2 = new Number("1");
console.log(typeof num1,typeof num2);//->"number" "object"
3)在类的原型继承中,instanceof检测出来的结果其实是不准确的
function Fun() {}
var a = new Fun;
console.log(a instanceof Array);//->false
console.log(a instanceof Object)//true
a不是一个数组,它就是一个普通的实例(普通的对象)
>虽然我们的fun继承了Array,但是a没有length和数字索引哪些东西,所以f应该不是数组才对,但是用instanceof检测的结果却是true,因为f虽然不是数组,但是在f的原型链上可以找到Array
function fun() {
}
fun.prototype = new Array;//->fun子类继承了Array这个父类中的属性和方法
var a = new fun;
console.log(f instanceof Array);//->true
3、Object.prototype.toString.call(value)
找到Object原型上的toString方法,让方法执行,并且让方法中的this变为value(value->就是我们要检测数据类型的值)
->toString:一个方法,转换为字符串数据类型用的方法
每一个数据类型所属类的原型上都有toString方法,例如:Number.prototype/String.prototype/Array.prototype/Function.prototype...
除了Object上的toString,其他类原型上的toString都是把当前的数据值转换为字符串的意思
->null和undefined比较的特殊:他们所属类Null/Undefined的原型上也有toString,只不过不让我们用而已,不仅如此其实类的原型都给屏蔽了
->HTML元素对象的toString:虽然它的原型链很长,但是在其它类的原型上都没有toString,只有在最底层Object.prototype这上才有
var oDiv = document.getElementById("div1");
oDiv.toString();//->调用的其实也是Object.prototype.toString...
->alert、document.write这两种输出的方式其实都是把要输出的内容先转换为字符串,然后在输出的
alert([]);//->""
alert(true);//->"true"
alert({});//->这个就要调用Object.prototype上的toString了 ->?