js中判断是什么类型的数据typeof

JavaScript016

js中判断是什么类型的数据typeof,第1张

如何判断js中的数据类型:typeof、instanceof、 constructor、 prototype方法比较

如何判断js中的类型呢,先举几个例子:

var a = "iamstring."

var b = 222

var c= [1,2,3]

var d = new Date()

var e = function(){alert(111)}

var f = function(){this.name="22"}

最常见的判断方法:typeof

alert(typeof a) ------------>string

alert(typeof b) ------------>number

alert(typeof c) ------------>object

alert(typeof d) ------------>object

alert(typeof e) ------------>function

alert(typeof f) ------------>function

其中typeof返回的类型都是字符串形式,需注意,例如:

alert(typeof a == "string") ------------->true

alert(typeof a == String) --------------->false

另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。

判断已知对象类型的方法: instanceof

alert(c instanceof Array) --------------->true

alert(d instanceof Date)

alert(f instanceof Function) ------------>true

alert(f instanceof function) ------------>false

注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

根据对象的constructor判断: constructor

alert(c.constructor === Array) ---------->true

alert(d.constructor === Date) ----------->true

alert(e.constructor === Function) ------->true

注意: constructor 在类继承时会出错

eg,

function A(){}

function B(){}

A.prototype = new B()//A继承自B

var aObj = new A()

alert(aobj.constructor === B) ----------->true

alert(aobj.constructor === A) ----------->false

而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:

alert(aobj instanceof B) ---------------->true

alert(aobj instanceof B) ---------------->true

言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:

aobj.constructor = A//将自己的类赋值给对象的constructor属性

alert(aobj.constructor === A) ----------->true

alert(aobj.constructor === B) ----------->false//基类不会报true了

通用但很繁琐的方法: prototype

alert(Object.prototype.toString.call(a) === ‘[object String]’) ------->true

alert(Object.prototype.toString.call(b) === ‘[object Number]’) ------->true

alert(Object.prototype.toString.call(c) === ‘[object Array]’) ------->true

alert(Object.prototype.toString.call(d) === ‘[object Date]’) ------->true

alert(Object.prototype.toString.call(e) === ‘[object Function]’) ------->true

alert(Object.prototype.toString.call(f) === ‘[object Function]’) ------->true

大小写不能写错,比较麻烦,但胜在通用。

通常情况下用typeof 判断就可以了,遇到预知Object类型的情况可以选用instanceof或constructor方法,简单总结下,挖个坑,欢迎补充!

function execute(a,b,func){

    if(typeof func == 'function'){

        func(a,b)

    }

}

function add(a,b){

    alert(a+b)

}

execute(2,3,add)

像这种一般还是判断一下;

主要还是为了严谨吧

如果是最典型的构造函数模式,必须加上new:

function Man(age){

this.sex="male"

this.age=age

}

m1=Man(20)

m2=new Man(21)

m1就是函数Man()执行的返回值,也就是undefined. 在函数执行过程中,属性被加到全局作用域或者Man方法所属的对象上了。执行之后window.sex=="male"

而m2是Man的实例,Man {sex:"male",age:21}

function Man(age) {

var obj = new Object()

obj.sex = "mail"

obj.age = age

return obj

}

m3=Man(22)

这个就不需要加new,m3是一个Object,不是Man的实例。

native code中,加new就是返回这个构造函数的实例;不加作为函数就返回一个基本数据类型,或者会报错 “ DOM object constructor cannot be called as a function ”。

Date(),不加new返回当前时间,是一个字符串。加new的话,返回当前时间或者把参数格式化得到的时间,是一个Date对象。

String(),不加new将参数格式化为字符串,加new则返回的是String对象。它们的区别如下:

var s1=new String(2)

//如果把s1 log到控制台中,输出 String{0:"2"}

var s2=String(2)

//如果把s2 log到控制台中,输出 '2'

console.log(typeof s1)

//"object"

console.log(typeof s2)

//"string"

s1.pro = 1

console.log(s1.pro)

//1

s2.pro = 1

console.log(s2.pro)

//undefined

Number和String类似。

Array,Object加不加new貌似是一样的?

Image,XMLHttprequest等不能作为函数使用。