原始类型
今天先补充一下昨天剩下的知识点:Number的尾声部分:数值转换
上个博文讲到parseInt()进行数值转换。
如果第一个字符是数值字符,parseInt也能识别出各种整数格式。也就是说,如果字符以"0x"开头且后头是数字字符,就会当做一个十六进制整数;如果以0开头,就当做八进制整数。
var num1 = parseInt("1234ddd");//1234
var num2=parseInt("");//NaN
var num3=parseInt("0xA");//10(十六进制数)
var num4 =parseInt(22.5);//22
var num5 = parseInt(070);//56(八进制数)
var num6 = parseInt("70");//70(十进制)
var num7= parseInt("0xf");//15(十六进制)
您知道吗?
问题::
在使用parseInt()解析八进制字面量的字符串时,ECMAScript3和5产生分歧。如下:
var num5 = parseInt(""070);//56(八进制数)
//ECMAScript3认为是56(八进制),ECMAScript5认为是70(十进制)
ECMAScript 3 JavaScript的引擎中,"070"会被当做八进制解析。
而在ECMAScript 5中parseInt()已经不具备解析八进制的能力,因此前导0无效,从而数值变成了70。ECMAScript5中在非严格模式下依然如此。
为了消除上述的问题,已经给parseInt提供了第二个参数:即转换时使用的基数(多少进制)。如果知道要解析的值是十六进制,就会按照十六进制解析。
Var num=parseInt("0xAF",16);//175
//如果指定了基数,那么数值前面的0x就可以省略了。、
var num2 = parseInt("AF",16);//175
var num2 = parseInt("AF");//NaN
不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误解析我们建议无论在什么情况下都明确指定基数。
多数情况下,我们要解析的都是十进制数,因此始终将10作为第二个参数是有必要的。
parseFloat()函数
与parseInt类似,
区别一:
但是parseFloat的第一个小数点是有效的,第二个小数点就无效了,后面的字符就被忽略了。如"22.3.4"就会被转换成22.3。
区别二:
parseFloat和parseInt的第二个区别在于它始终忽略前导0。
parseFloat()可以识别前面讲的浮点数,也包括十进制的数。但是十六进制的字符串始终会被转换为0。由于parseFloat()始终转换十进制,因此没有第二个参数的说法。
最后需要注意:
如果一个字符串字符包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseFloat会返回整数。
var num1=parseFloat("13erwf");//13
var num2=parseFloat("0xA");//0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.44.32");//22.44
var num5 = parseFloat("0908.4");//908.4
var num6 = parseFloat("3.125e7");//31250000
String类型
String类型用于表示由0 或多个16位Unicode字符组成的字符序列。可以用双引号,可以用单引号。两种字符串的写法都有效。引号必须成对的出现,即单引号开头,结尾必须为单引号。
var msg = "this is string";//有效
var msg = 'this is string';//有效
var msg = "this is string';//无效
5.1 字符字面量如下所示:
5.2 字符串的特点:
ECMAScript中字符串时不可变的。也就是说字符串一旦创建,它们的值就不会改变。
要改变某个变量保存 的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
var lang = "java";
lang=lang+"script";
alert(lang);//javascript
如果字符串中的包含双字节字符,那么length属性可能不会精确地返回字符串中的字符数目。
双字节字符
单字节指只占一个bai字,是英文字符。双du字是占两个字节的,中文字符都占两个字节
单字节的英文是Byte;比特是最小的数值单位,它的英文是Bit。
一个字节包含8个比特,通常计算机初学者接触到的ASCII码就是单字节字符,由于计算机是二进制的,1个比特位只可以表示为0或者1这两种数,那8个比特(一般从右至左)就可以有0~127(2的8次方再减1)的不同的数值表示。
双字节字符即是包含了两个字节共16比特。
一般比较好理解的就是:英文字母属于单字节字符,而汉字则属于双字节字符。因为英文字母、数字、符号等完全可以用128种不同的数值来表示,而汉字太多则不能,所以才需要扩展到双字节。
ASCII码
5.3 转换为字符串
要把一个数值转换为字符串的方法有两种:toString()方法和String()函数。
toString():
这个方法唯一要做的就是返回相应值的字符串的表现。
var age = 11;
var ageAsString=age.toString();//字符串"11"
var found = true;
var FoundAsString = found.toString();//字符串"true"
数值、布尔值、对象、字符串都有toString()方法,该方法返回字符串的一个副本,但是null和undefined没有这个方法。
多数情况下,toString方法不必传递参数。但是在调用数值的toString方法是,可以传递一个参数:输出数值的基数。
默认情况下,toString方法以十进制格式返回数值的字符串表示。而通过传递基数可以输出二进制、八进制、十六进制,乃至其他任意有效的进制格式表示的数值。
var num=10;
alert(num.toString());//"10"
alert(num.toString(2));//"1010"
alert(num.toString(8));//"12"
alert(num.toString(10));//"10"
alert(num.toString(16));//"a"
以上例子说明,toString方法会改变输出的值。
注意:
默认的(没有参数)输出值与指定基数10时的输出值相同。
String函数
在不知道要转换的值是不是null或者undefined时,可以使用转型String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下面的转换规则:
- 如果有值有toString()方法,则调用该方法没有参数并返回相应的结果。
- 如果值是null,则返回"null"。
- 如果值是undefined,则返回"undefined".
console.log(String(null));//"null"
console.log(String(undefined));//"undefined"
数值和布尔值的转换结果与调用toString()方法得到的结果相同。
因为null和undefined没有toString()方法,所以String()函数返回这两个字面量的值。
要把某个值转换为字符串,可以使用加号操作符把它与一个字符串("")加在一起。