整理:JavaScript 各种转型函数与类型转换细节
本文为个人整理,方便查阅。主要参考的资料是js高程(3rd),如有错漏之处,欢迎指正。希望能帮到自己和更多的人
先看看转换成各种类型的一些细节
1. 转成字符串
数值、布尔值、对象和字符串值都有toString()方法,但 null 和 undefined 值没有这个方法,所以在不知道要转换的值是不是null或者undefined的情况下,可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:
- 如果值有toString()方法,则调用该方法(不传参)并返回相应结果;
- 如果值是null,则返回"null";
- 如果值是undefined,则返回"undefined"。
下面看几个例子
String(10); //"10" String(true); //"true" String(null); //"null" String("fsdfsdfs"); //"fsdfsdfs"
留坑占位
2. 转成布尔值
布尔值只有两个:true和false,而且是区分大小写的。但是ECMAScript中所有类型的值都有与这两个布尔值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。其具体对应关系参照下表:
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数字(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
3. 转成数值
有三个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。第一个函数即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换为数值。这里只重点介绍转型函数Number() 和parseInt()。转型函数Number()的转换规则如下:
- 如果是Boolean值,true和false将分别被转换为1和0;
- 如果是数字值,只是简单的传入和返回;
- 如果是null值,则返回0;
- 如果是undefined,则返回NaN;
- 如果是字符串,则遵循下列规则:
- 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值。即"0011"被转为11(前导零被忽略了);
- 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,如"0xf",这将其转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符),则将其转换为0;
- 如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
- 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串。
/******分割线********/
由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数时更常用的是parseInt()函数。它在转换字符串时,更多的是看其是否符合数值模式。规则如下:
- 忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。
下面是几个parseInt()转换的例子:
parseInt("1234blue"); //1234 parseInt(22.5); //22 parseInt(" -22.5sdf"); //-22 parseInt(""); //NaN parseInt("+22.5"); //22
4. 自动转型
4.1 加性操作符 "+" 和 "-"
关于自动转型,这两个加性操作符相对来说更有用的是加法操作符 "+",所以这里重点介绍加法操作符运算规则:
- 如果两个操作符都是数值,执行常规的加法计算;
- 如果作为一元加操作符,则调用 Number() 转型函数将其操作数转换为数值(转成数值的细节参考上文);
- 如果有一个操作数是字符串,就要应用以下规则
- 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来(转换为字符串的细节参考上文)。
下面举几个例子:
typeof +"44444"; //number "555" + 22; //"55522" + "123fdfsdf" //NaN + null //0
4.2 while 、if 等逻辑表达式中的自动转型
举例,if(condition) 中的 "condition" 可以是任意表达式,对这个表达式求值的结果不一定是布尔值,ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值(具体转换细节参考上文)。
4.3 相等操作符的自动转换
众所周知,相等操作符中有相等和不相等,全等和不全等。其中相等和不相等——会先转换再比较,全等和不全等——仅比较而不转换。这里讨论的是相等和不相等的转换细节。
在转换不同的数据类型时,相等和不相等操作符遵循下列基本原则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1;
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
比较时则遵循下列规则:
- null 和 undefined 是相等的;
- 在比较前,不转换 null 和undefined;
- 如果有一个操作数是NaN,则相等操作符 "==" 返回false;
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则false。
下面列出一些特殊情况的比较结果:
null == undefined //true "NaN" == NaN //false NaN == NaN //false false == 0 //true true == 1 //true true == 2 //false undefined == 0 //false null == 0 //false "5" == 5 //true
4.4 逻辑非!
逻辑非可以应用于ECMAScript中的任何值,无论这个值是什么类型的,这个操作数都会返回一个布尔值(逻辑与则不一定)。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。同时使用两个逻辑非,实际上就会模拟 Boolean() 转型函数的行为(具体转换细节参照上文)。
这里顺带提一下逻辑与 &&
逻辑与操作可以应用于任何类型的操作数。在有一个操作数不是布尔值或两个操作数都不是布尔值的情况下,逻辑与操作不一定返回布尔值。它有下面特点:
- 如果对第一个操作数求值为 true,则返回第二个操作数;
- 如果对第一个操作数求值为 false,则返回第一个操作数。
同时记住,逻辑与操作符是一个短路操作。即如果第一个操作数就能决定结果,那么就不会再对第二个操作数求值。比如下例:
"" && fsdfsdfsdfs //""(不会报错,因为根本不会执行后面的语句)
"0" && fsdfsdfsdf //报错:ReferenceError: fsdfsdfsdf is not defined
逻辑或同理。
yun