javascript中变量的类型转换

JavaScript中的取值类型非常灵活,当javascript期望使用一个布尔值的时候,你可以提供任意类型值,javascript将根据需要自行转换类型,一些真值转换为true,其他值转换为false。这在其他类型中同样适用:如果javascript期望使用一个字符串,它把给定的值 将转换为字符串。如果javascript期望使用一个数字,它把给定的值将转换为数字(转换结果无意义的话将返回NaN)。
下图是javascript中原始值到原始值的转换规律:

这里写图片描述

1、变量的显示类型转换

做显式类型转换最简单的方法就是使用Boolean()、Number()、String()、或Object()函数。当不通过new运算符调用这些函数时,它们会作为类型转换函数并按照上图描述的规则做类型转换。
需要注意的是,除了null或undefined之外的任何值都具有toString()方法,这个方法的执行结果通常和String()方法的返回结果一致。还有就是,如果试图把null或undefined转换为对象,则会产生一个类型错误(TypeError)。
 在javascript中提供了专门的函数和方法用来做更加精确的数字到字符串和字符串到数字的转换。
 Number类的toString()方法可以接收表示转换基数的可选参数,如果不指定此参数,转换规则将是基于十进制。同样可以将数字转换为其他进制娄(范围在2~36之间),例如:
 var n = 17;
 binary_string = n.toString(2);//转换为“10001”
 octal_string = "0" + n.toString(8)//转换为“021”
 hex_string = "ox" + n.toString(16)//转换为“0x11”
 类似的,还有其他的一些方法,例如:

var n=123456.789;
n.toFixed(0);//”123457”
n.toFixed(2);//”12345679”
n.toFixed(5);//”123456.78900”
n.toExponential(1);//”1.2e+5”
n.toExponential(3);//”1.235e+5”
n.toPrecision(4);//”1.235e+5”
n.toPrecision(7);//”123546.8”
n.toPrecision(7);//”123456.7890”
方法说明:
toFixed()根据指数记数法将数字 转换为字符串,它从不使用指数记数法
toExponential()使用指数指数记数法将数字转换为指数形式的字符串
toPrecision()根据指定的有效数字位数将数字转换为字符串。
最后就是parseInt()(只解析整数)和parseFloat()(可以解析整数和浮点数)方法;
parseInt()可以对前缀是”0x”或者”0X”的字符串进行十六进制数的解析,两个方法均可以跳过任意数量的前导空格,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,则返回NaN。
parseInt(“2+3”) //结果为2
parseInt(“-12.34”) //-12
parseInt(“0xFF”) //255
parseInt(“-0xFF”) //-255
parseFloat(“.1”) //0.1
parseInt(“.1”) //NaN:整数不能以.开始
parseFloat(“ 721.5")//NaN 开始
此外,parseInt()可以接收第二个可选参数,这个参数指定数字转换的基数,合法的取值范围是2~36。
2、对象到原始值的转换
对象到布尔值的转换非常简单:所有对象(包括数组和函数)都转换为true。包装对象亦是如此:new Boolean(false)是一个对象而不是原始值,它将转换为true。
对象到字符串和对象到数字的转换是通过调用待转换对象的相关方法来实现的(toString()和valueOf())。这里说的转换规则只适用于本地对象,宿主对象根据各自的算法可以转换成字符串和数字。
toString()方法返回一个表示对象的字符串,valueOf()返回将对象转换为表示它的原始值,但大多数对象无法真正表示为一个原始值,因此默认的valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是 简单返回对象本身。日期类定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数。
javascript中对象到字符串的转换经过了如下这些步骤:
如果对象具有toString()方法,则调用这个 方法。如果它返回一个原始值,javascript将这个 值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
如果对象没有toString()方法,或者这个 方法并不返回一个原始值 ,那么javascript就会调用valueOf()方法。如果存在这个方法,则调用它。如果返回值是原始值,javascript将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
否则,javascript无法从toString()或valueOf()方法获得一个原始值,因此这时它将抛出一个类型错误异常。
对象到数字的转换过程中,javascript估了同样的事情,只是它会首先尝试使用valueOf()方法。
最后需要注意的是,”+”和“==”应用的对象到原始值 的转换包含日期对象的一种特殊情形。日期类是javascript语言核心中唯一的预先定义的类型,它定义了有意义的向字符串和数字类型的转换。对于所有的非日期的对象来说,对象到原始的转换基本上是对象到数字的转换,日期对象则使用对象到字符串的转换模式,然而,这里的转换和上面提到的并不完全一致:通过valueOf()或toString()返回的原始值将被直接使用,而不会被强制转换为数字或字符串。

猜你喜欢

转载自blog.csdn.net/yangkaige111/article/details/72864516