整理: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的值
Booleantruefalse
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;
  • 如果是字符串,则遵循下列规则:
  1. 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值。即"0011"被转为11(前导零被忽略了);
  2. 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样也会忽略前导零);
  3. 如果字符串中包含有效的十六进制格式,如"0xf",这将其转换为相同大小的十进制整数值;
  4. 如果字符串是空的(不包含任何字符),则将其转换为0;
  5. 如果字符串中包含除上述格式之外的字符,则将其转换为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() 转型函数将其操作数转换为数值(转成数值的细节参考上文);
  • 如果有一个操作数是字符串,就要应用以下规则
  1. 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
  2. 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来(转换为字符串的细节参考上文)。

下面举几个例子:

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

 逻辑或同理。

转载于:https://www.cnblogs.com/yuny/p/7826442.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值