JavaScript中的数值转换和字符串转换
1. 数值转换
有三个函数可以把非数值转换为数值,Number()、parseInt()和parseFloat()。
Number()函数可以用于任何数据类型的转换
parseInt()与parseFloat()则专门用于把字符串转换为数值。
Number()函数
Number()函数的转换规则如下:
- 如果是boolean值,true和false将分别被转换成1和0
- 如果是数字值,知识简单的传入和返回
- 如果是null值,返回0
- 如果是undefined,返回NaN
- 如果是对象,则调用对象的valueOf()方法,如果转换的结果为NaN,则使用toString()方法
- 如果是字符串,则遵循以下规则:
- 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制的值。
- 如果字符串中包含有效的浮点格式,则将其转换成对应的浮点数值。
- 如果字符串中包含有效的十六进制数值,,则将其转换为相同大小的浮点数值。
- 如果字符串是空的(不包含任何字符),则将其转换为0
- 如果字符串中包含了除上述格式之外的字符,则转换为NaN
举几个例子吧:
var num1 = Number("Hello world!");
var num2 = Number("");
var num3 = Number("001234");
var num4 = Number(true);
console.log(num1); //NaN
console.log(num2); //0
console.log(num3); //1234
console.log(num4); //1
parseInt()函数
parseInt()函数在转换字符串时,更多的是看其是否符合数值类型。他会忽略字符串前面的空格,直至找到一个非空格字符。如果第一个字符不是数字字符或负号,parseInt()就会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符串返回0)。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有字符或遇到了一个非数字字符。
如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(十进制、八进制、十六进制数)。也就是说,如果字符串——"0x"开头且后面跟数字字符,就会将其当做一个十六进制的整数。如果字符串以"0"开头,且后面跟数字字符,则会将其当作一个八进制数来解析。
说再多也没用,来几个实在点的例子吧:
var num1 = parseInt("123green");
var num2 = parseInt("0xA");
var num3 = parseInt("");
var num4 = parseInt("22.5");
var num5 = parseInt("070");
var num6 = parseInt("70");
var num7 = parseInt("0xf");
console.log(num1); //123
console.log(num2); //10(十六进制数)
console.log(num3); //NaN
console.log(num4); //22
console.log(num5); //70(八进制数)
console.log(num6); //70(十进制数)
console.log(num7); //15(十六进制数)
在使用parseInt()函数解析八进制字面量的字符串时,ECMAScript 3和5存在分歧。例如:
//ECMAScript 3认为56(八进制),ECMAScript 5认为是70(十进制)
var num = parseInt("070");
怎么办?为了消除parseInt()函数的这种困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。如果知道解析的值是十六进制的字符串,那么久指定基数是16,作为第二个参数,可以保证得到正确的结果。
在举个例子吧:
var num1 = parseInt("0xAF",16);
var num2 = parseInt("AF");
console.log(num1); //175
console.log(num2); //NaN
var num3 = parseInt("10",2);
var num4 = parseInt("10",8);
var num5 = parseInt("10",10);
var num6 = parseInt("10",16);
console.log(num3); //2(按二进制解析)
console.log(num4); //8(按八进制解析)
console.log(num5); //10(按十进制解析)
console.log(num6); //16(按十六进制解析)
2. 字符串转换
要想把一个值转换为字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。第二种是使用转型函数String(),这个函数可把任何类型的值转换为字符串。
toString()函数
这个方法唯一要做的就是返回相应的值的字符串表现。看例子:
var age = 11;
var ageAsString = age.toString();
var found = true;
var foundAsString = found.toString();
console.log(ageAsString); //11
console.log(foundAsString); //true
数值、布尔值、对象和字符串值都有toString()方法,但是null和undefined没有toString()方法。多数情况下,调用toString()方法不必传递参数。但是在调用数值的toString()方法时,可以传递一个参数,输入数值的基数(代表几进制)。
举例吧:
var num = 10;
console.log(num.toString()); //"10"(十进制)
console.log(num.toString(2)); //"1010"(二进制)
console.log(num.toString(8)); //"12"(八进制)
console.log(num.toString(10)); //"10"(十进制)
console.log(num.toString(16)); //"a"(十六进制)
String()函数
在不知道null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串,String()函数遵循以下规则:
- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
- 如果值是null,则返回"null"
- 如果值是undefined,则返回"undefined"
看几个例子:
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1)); //"10"
console.log(String(value2)); //"true"
console.log(String(value3)); //"null"
console.log(String(value4)); //"undefined"
这里先后转换了4个值:数值、布尔值、null、undefined。数值和布尔值的转换结果与调用toString()方法得到的结果相同。因为null和undefined没有toString()方法,所以String()函数就返回了这两个值的字面量。
要把某个值转换为字符串,也可以使用加法运算符。
举例吧:
var num = 10;
var num1 = num+"";
console.log(num); //10
console.log(num1); //"10"