【慕课学习】《JavaScript深入浅出》——javascript数据类型

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方法是指根据变量的特征来判断其类型,比如判断其是否包含某些属性或方法,以及属性值是否是预期的值等特征。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值