javascript是一种弱数据类型的编程语言,使用var来声明变量,但一般不需要声明变量的数据类型,并且js的变量之间能很容易得转换变量类型。
javascript主要有6种数据类型,又分为两类,一类是原始数据类型,包括5种类型:
number
string
boolean
null
undefined
还有一类则是对象类型,即object类型。
js中类型可以进行隐式转换,可以通过“+”和“-”来进行number类型与其他类型之间的转换。
js中不同类型的数据之间也可以进行比较,在比较时会进行数据类型转换:
null == undefined //true
number == string ->string转number再比较 1.2 == "1.2" //true
boolean == ? ->boolean转number true == 1 / false == 0
object == number/string ->尝试将对象转为基础类型再比较 new String('hi') == 'hi' //true
比较时需注意:
null == undefined //true
null == false //false
NaN == NaN //fasle
[] == [] //false
new Object() == new Object() //false
对象类型在进行比较时,即使长度和值完全一样,但只要不是同一个对象,那么便互不相等;
NaN与任何变量都不相等,甚至不等于自身,即NaN != NaN。
js的number/string/boolean类型都在object类型中对应有各自的包装类型Number/String/Boolean,在声明一个基本类型的变量如 var str = “string” ,并进行访问length等操作时,js会自动临时将其转换为对应的包装类型对象,从而可以进行访问或设置属性的操作,但在完成这一步操作后这个临时的对象会被销毁掉。如下:
var str = "string";
alert(str.length); //6,操作过程中转换为包装对象
str.t = 3; //操作过程中转换为包装对象
alert(str.t); //undefined,因为上面的操作结束后临时对象已销毁
js进行类型检测的主要方法有五种:
typeof
instanceof
Object.prototype.toString
constructor
duck type
最常见的是typeof方法,会返回一个字符串,适合函数对象或基础数据类型,但是遇到null会失效:
typeof 100 // "number",也可以用这种写法 typeof(100)
typeof true // "boolean"
typeof function // "function"
typeof undefined // "undefined"
typeof null // "object"
typeof [1,2] // "object"
typeof new Object() // "object"
typeof NaN // "number"
针对对象,采用instanceof来判断具体类型(适合自定义对象,也可以用来检测原生对象,在不同iframe或window之间检测时会失效):
obj instanceof Object
[1,2] instanceof Array === true
new Object() instanceof Array === false
Object.prototype.toString通过{}.toString拿到,适合内置对象(数组和函数等)和基本类型,遇到null和undefined时存在兼容性问题(IE678等返回[Objeact Object]):
Object.prototype.toString.apply(100) //"[Object Number]"
Object.prototype.toString.apply([]) //"[Object Array]"
Object.prototype.toString.apply(function(){}) //"[Object Function]"
Object.prototype.toString.apply(null) //"[Object Null]",非IE678
Object.prototype.toString.apply(undefined) //"[Object Undefined]",非IE678
任何一个对象都有一个constructor属性,实际上是继承自原型的,会指向构造这个对象的构造器/构造函数,但是这个属性可以被改写,需小心使用。
duck type方法是指根据变量的特征来判断其类型,比如判断其是否包含某些属性或方法,以及属性值是否是预期的值等特征。