优秀的编程知识分享平台

网站首页 > 技术文章 正文

第9节 Javascript数据类型转换-零点程序员-王唯

nanyue 2024-11-01 12:45:24 技术文章 6 ℃

JavaScript中的数据类型非常灵活;将一种类型转为另外一种数据类型,如:将string类型的1转换为数字类型的1;

为什么要进行类型转换:因为数据之间的运算需要是同类型的运算,如果不同类型进行运算,需要将其转换为同一种类型后再进行运算。

类型转换分为两种:强制类型转换和自动类型转换;

1)自动转换:

在运行过程中根据运算的语意环境,会自动进行类型转换;

var a="2",b="1";
console.log(a-b);
b = true;
console.log(a-b);

注:最经典的是用在if语句中的条件中:

var car = new Object();
if(car){
    console.log("汽车");
}

2)强制(显式)类型转换:

尽管JavaScript可以自动进行类型转换,但有时仍需要显示转换,或者有时为了使代码变得更加清晰易读。

使用String()、Number()、Boolean()等函数强制转换;


a)转换为数值:

有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat();Number()可以用于任何类型,而另外两个则专门用于把字符串转换成数值;这三个函数对于同样的输入会有不同的返回结果;

Number()函数:转换规则如下:

如果是Boolean值,true和false分别被转换为1和0;

如果是数字值,会直接返回该数值;

如果是undefined,返回NaN;

如果是null,返回0;

如果是字符串,则遵循以下规则:如果字符串中只包含数字(包括前面的正号或负号),则将其转换为十进制数,如“123”会变成123,而“011“会变成11(注:前导零忽略了);如果字符串中包含有效的浮点格式,如”1.1“,会被转换为浮点数值(同样,也忽略前导零);如果字符串包含有效的十六进制格式 ,如”0xf“,则被转换为相同大小的十进制数;会忽略字符串前面的空格;如果字符串是空的(不包含任何字符),则转换为0;如果字符串中包含除上述格式之外的字符,则被转换为NaN;

如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值;

一元操作符(+、-)的操作与Number()函数相同,会将操作数转换为数字;

var x = "w";
console.log(typeof +x);  // 等价于 x - 0

parseInt()和parseFloat()函数:

由于Number()函数在转换字符串时比较复杂而且不够合理,并且只能基于十进制数进行转换,且不能出现非法的尾随字符,因此在处理整数的时候更常用的是parseInt()和parseFloat()函数;

二者是全局函数,不从属于任何对象的方法;

其在转换时,更多的是看其是否符合数值模式;它会忽略字符串前面的空格,直到找到第一个非空字符;如果第一个字符不是数字字符或者负号,其会返回NaN,即parseInt()转换空字符串时会返回NaN(Number不会);如果第一个字符是数字,parseInt()会继续解析第二个字符,直到解析完后续所有字符或遇到到一个非数字字符;如:

console.log(parseInt("123red"));  // 123
console.log(parseInt("    8a"));  // 8
console.log(parseInt(22.5));  // 22
console.log(parseInt("wang"));  // NaN
console.log(parseInt(""));  // NaN

parseInt()可以识别出十六进制数,识别不了八进制,在解析八进制时,去除零转换为十进制;

console.log(parseInt("0xAF"));  // 10*16 + 15 = 175
console.log(parseInt("  0xAFwangwei"));  // 175
console.log(parseInt("070"));  // 70

parseInt()在识别八进制时,第3版可以识别,但第5版识别不了,为了解决这个问题,可以为parseInt()指定第二个参数:转换基数,如:

console.log(parseInt("0xAF",16));  // 175
console.log(parseInt("070",8));  // 56

在指定了进制后,字符串可以不带前面的“0x“或“0”,如:

console.log(parseInt("AF",16));  // 175
console.log(parseInt("70",8));  // 56

注:当然除了八进制,十六进制,还可以指定其他进制;如:

console.log(parseInt("11",2));  // 1*2 + 1 = 3
console.log(parseInt("ff",16));  // 15 * 16 + 15 = 255
console.log(parseInt("zz",36));  // 35 * 36 + 35 = 1295
console.log(parseInt("077",8));  // 7 * 8 + 7 = 63
console.log(parseInt("077",10));  // 7 * 10 + 7 = 77

与parseInt()类似,parseFloat()也是如此,但如果字符串里有两个小数点,第二个小数点就是无效的了。

console.log(parseFloat("22.23.5"));  // 22.23

parseFloat()只能解析十进制数,会忽略字符串的前导零,即十六进制数会被始终转换成0;

如果字符串包含的是一个可解析为整数的值,或者小数点后是零,parseFloat()会返回整数;

console.log(parseFloat("123abc"));  // 123
console.log(parseFloat("123.56abc"));  // 123.56
console.log(parseFloat("0xA"));  // 0
console.log(parseFloat("22.5"));  // 22.5
console.log(parseFloat("0909.5"));  // 909.5
console.log(parseFloat("3.125e6"));   // 3125000

b) 转换为字符串:

要把一个值转换为一个字符串有两种方式;第一种是使用几乎每个值都有的toString()方法;该方法会返回相应值的字符串;

var age = 18;
var ageString = age.toString();
var found = true;
console.log(found);  // "true" ,实际上调用了:found.toString()或found.valueof();

注:数值、布尔值、对象和字符串值都有toString()方法,但null和undefined值没有这个方法;

可以为toString()指定一个可选的基数(radix)的参数;默认情况下,toString()方法以十进制格式返回数值的字符串表示;通过设置基数,可以输出其他进制表示的字符串;如:

var age = 18;
console.log(age.toString(2));  // 10010
console.log(age.toString(8));  // 22
console.log(age.toString(16));  // 12

第二种方法:使用String(),这个函数可以将任何类型的值转换为字符串,包括null或undefined;

转换规则:如果值有toString()方法,则调用该方法(没有参数);如果值是null,则返回null;如果是undefined,则返回undefined;

console.log(String(null));  // null
console.log(String(undefined));  // undefined

如果要把某个值转换为字符串,可以使用加号操作符把它与一个空字符串拼接。

var str = 10 + "";
console.log(typeof str);  // string

c)转换为Boolean:

可以使用转型函数Boolean(),如:var message = "zero"; alert(Boolean(message));

使用Boolean(),会返回一个Boolean一个值,但返回的值是true还是false,取决于要转换值的数据类型及其实际值;

这些转换规则一般用在控制语句(如if语句)自动执行相应的Boolean转换,如:

var msg = "zero";
if(msg){
    console.log(msg);
}

一元“!”运算符也将其操作数转换为布尔值并取反,这是在代码中进行这种类型转换的惯用用法:

var x = "w";
console.log(!!x);  // 等价于 Boolean(x)

检测类型:

typeof操作符:

ECMAScript中的数据是松散类型的,因此需要有一种方法来检测给定的变量的数据类型:typeof,其会返回以下字符串:

undefined值未定义、boolean布尔值、string字符串、number数值、object对象或null、function函数;

var msg = "zeronetwork";
console.log(typeof msg);
console.log(typeof(msg));
console.log(typeof 18);

说明:typeof是一个操作而非不是一个函数,因此可以不使用括号;

注:有时typeof会返回一个令人迷惑但技术上却正确的值,如:typeof null,会返回object,因为特殊值null被认为是一个空的对象引用;

注:从技术角度来说,函数在ECMAScript中是对象,不是一种数据类型;然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的。

instanceof操作符:

虽然typeof是个非常有用的工具,但是在检测引用类型的值时,用处不大;有时,想确认一个对象具体是什么类型的对象,就需要使用instanceof操作符了;

语法:result = variable instanceof constructor

如果变量是引用类型的实例,其会返回true,如:

var num=1;
console.log(num instanceof Number);
var person = new Object();
console.log(person instanceof Object);
var color = new Array();
alconsole.log(color instanceof Array);
var pattern = new RegExp();
console.log(pattern instanceof RegExp);

说明:根据规定,所有引用类型的值都是Object的实例;因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true;

使用instanceof操作符在检测基本类型的值,会返回false,因为基本类型不是对象。


Tags:

最近发表
标签列表