在js中,总的来讲数据类型分为两大类,一类是原始值类型的,一类是引用类型的。原始值类型的包括:字符串(String) 、数字(Number) 、布尔值(Boolean) 以及两个特殊的值 null 和 undefined 。引用类型的主要是指对象,在js中,对象的范围很广,甚至有js中一切都是对象这样的说法。对象能够分为 对象(Object) 以及更具体的数组(Array) 、 函数(Function) 等类型。要注意的是,js中typeof运算符返回的类型只有:sting、number、boolean、object、function、undefined几种,typeof null 返回的是 object,但通常认为null是不属于对象的。 数组
关于js中是否是一切都是对象这句话,实际上是有争议的。例如,咱们能够直接在经过单引号或双引号定义的字符串字面量上调用方法: 函数
'this is a string'.charAt(0);这条语句是可以执行并获得正确结果的。字符串的确是个对象,可是问题在于没有经过构造函数而是直接使用字面量的字符串又算不算对象呢?这还要说吗,这个语句不就是在字符串字面量上调用的方法嘛,能调用方法的固然是对象了。是的,咱们看到的的确是这样,但事实又是如何呢?
事实就是,经过字面量定义的字符串并非对象,或者最多只能说它是个伪对象,由于当在字符串字面量上调用方法或属性时,程序会在背后默默的建立一个 与这个字面量的值相等的临时字符串对象,而后再在这个临时对象上调用属性或方法,最后把结果返回去,这个临时字符串对象完成使命后也随之会被销毁。 this
还有一个有力的证据就是,你能够在字符串字面量上添加一个属性,或者是改变一个属性值,但结果是没法成功的: spa
vars ='this is a string'; s.bar ='hello';//给这个字符串添加一个属性 alert(s.bar);//结果获得的是 undefined,不是 'hello'获得undefined的缘由是,s.bar 这个属性是加在了程序偷偷建立的那个临时字符串对象上,但咱们没法获得这个临时字符创对象的引用,并且这个临时字符串对象很快就被销毁了。因此给字符串字面量添加属性或改变属性值是没有任何意义的,由于它根本不会受到影响。
数字字面量以及布尔值字面量也是相似的原理,这里就再也不赘述了。 prototype
下面进入正题了---js中各类数据类型间的相互转换。 code
1、转换成布尔值 对象
程序在 if 语句 以及 ||、&&、! 等逻辑判断的环境下会把表达式自动转换成布尔值。
想要手动转换某个东西为布尔值有两种方法:一、使用 !! ; 二、使用 Boolean(),记住前面不要加new; blog
一、数字转换成布尔值 字符串
除了0被转换成false外,全部自他数字都会被转换成true, NaN 也老是被转换成false get
二、字符串转换成布尔值
这个更简单,除了空字符串被转换成false外,全部字符串都会被转换成true
三、其余类型转换成布尔值
undefined和null会被转换成false, 任何对象(包括数组)和函数都会被转换成true,记住,是任何
varo =newBoolean(false); alert(o);//转换成字符串,结果是false alert(!!o);//转换成布尔值,结果是 true
2、转换成字符串
把某一个东西强制转换成字符串有两种方法:
''+ x//方法一,用一个空字符串与之相加 String(x)//方法二,使用不带new的字符串构造函数一、数字转换成字符串
这个没什么要说的,数字都是按原样转换成字符串,但用科学计数法表示的数字(也就是带e的)会转换成它内部表明的真实的数字的字符串。
还须要注意的是,当使用二元的加号运算符时,若是两个运算数中有一个不是数字,则会进行字符串的链接操做,而不是数学加法操做,两个运算数都会被转换成字符串。当null与数字相加时,不会进行字符串链接,而是会把null转换成0来进行数学元素。
[]+1+3 //结果为13 [1]+3 //结果为13 null+1+3 //结果为4二、其余类型转换成字符串
当对象或函数转换成字符串时,会调用它们的 toString() 方法来进行转换,默认的是 Object.prototype.toString 和 Function.prototype.toString,但它们是能够被咱们自定义的toString方法覆盖的。当把一个函数转换成一个字符串时,不 必定就要显示函数的源代码,Function.prototype.toString 方法的结果依赖于它的环境是怎么实现它的。
3、转换成数字
除了加号之外的其余数学运算符,都会进行转换为数字的操做。把一个东西强制转换成数字也有两种方法:
+x//使用一个一元的加号运算符,这是最快的方法 x-0 或 x*1//另外一种形式 Number(x) //使用不带new的数字构造函数进行转换一、字符串转换成数字
除了空字符串会被转换成0之外,若是字符串中是正确的数字书写形式,那么均可以顺利转换成相应的数字,不论是小数、科学计数仍是八进制、十六进制形式等。可是若是参杂了其余不能构成数字或不符合数字书写规则的东西,则会被转换成NaN。
NaN是指不是数字的意思,任何数字数字跟NaN进行运算获得的结果都是NaN,NaN甚至跟本身也不相等。
二、其它类型转换成数字
对象和函数老是被转换成NaN, undefined也会被转换成NaN, 但null会被转换成0
上面的表遗漏了数组的状况。数组会首先被转换成字符串,而后再转换成数字。
alert(+[]); //结果为0 alert(+[1]);//结果为1 alert(+[1,2]);//结果为NaN alert(+newArray(1));//结果为0 alert(+newArray(1,2));//结果为NaN三、两个数字转换函数
parseInt
parseFloat
数据类型转换看起来很简单,但有些东西却很容易弄混淆,要想真正掌握它,也仍是要花费一些功夫的。