本文为个人整理,方便查阅。主要参考的资料是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;
  • 如果是字符串,则遵循下列规则:
  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

整理:JavaScript 各种转型函数与类型转换细节相关推荐

  1. JavaScript(三)数据类型转换

    类型转换 JavaScript中的取值类型非常灵活,如当JavaScript期望使用一个布尔值的时候,你可以提供其它数据类型的,JavaScript将根据需要自行转换数据类型.如下示例: 10 + & ...

  2. 前端面试整理JavaScript

    1.eval是做什么的? 它的功能是把对应的字符串解析成JS代码并运行: 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行). 2. null,undefined 的区别? ...

  3. 如何用JavaScript的回调函数做出承诺

    by Adham El Banhawy 由Adham El Banhawy 如何用JavaScript的回调函数做出承诺 (How to make a Promise out of a Callbac ...

  4. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  5. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  6. Cordova插件中JavaScript代码与Java的交互细节介绍

    在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...

  7. 转换php script类型,javascript如何实现值的类型转换

    本篇文章给大家介绍使用javascript进行值的类型转换的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. JavaScript是松散类型的语言,大多数情况下,运算符和函数会自 ...

  8. C++函数重载解析细节

    Copyright(C)<C++从入门到精通-经典完整版> 函数重载解析细节 函数重载解析过程有三个步骤这些步骤可以总结如下: 1 确定为该调用而考虑的候选函数以及函数调用中的实参表属性 ...

  9. JavaScript专题(七)类型转换

    JavaScript专题之最让人头疼的类型转换 目录 前言 一.类型转换是什么? 二.原始值转换的基本规则 三.对象转字符串和数字 四.常见的类型转换运算符 五.常见的类型转换操作 写在最后 前言 在 ...

最新文章

  1. 基于 Prometheus、InfluxDB 与 Grafana 打造监控平台
  2. 如何在 TensorFlow 中用深度学习修复图像?(附论文)
  3. 六类布线六大注意事项
  4. YoloAll V2发布,集成所有主流Yolo模型于一身
  5. matlab空格会消失了,如何在Matlab中自动删除保存的尾随空格?
  6. 前端学习(482):html之b/s和c/s
  7. 大数据_MapperReduce_Hbase的优化_高可用 预分区_防止数据倾斜_JAVAAPI创建预分区---Hbase工作笔记0026
  8. Docker学习笔记_安装和使用Zookeeper
  9. 8.深入分布式缓存:从原理到实践 --- 分布式Redis
  10. iOS中TableView小技巧
  11. Windows内核研究工具
  12. i8一点通如何加载虚拟光驱玩游戏
  13. 人社部《专项职业能力证书》如何考取!含金量!证书效力!
  14. 一次搞懂清晰度、对比度以及锐化的区别
  15. 将文件从VMWare虚拟机的Linux系统传到U盘
  16. 英语四六级考试忘记准考证?怎么办?
  17. k-means+matlab 之辣鸡学算法
  18. 人脸识别 无法打开相机 笔记本_笔记本电脑提示找不到支持Windows hello人脸的摄像头的解决办法...
  19. 二元置信椭圆r语言_一般加性模型的简介、应用举例及R语言操作
  20. 八斗大数据清华班全链路 百度网盘

热门文章

  1. FastCGI 进程管理器(FPM)
  2. 电流型和电压模拟量信号有何区别,如何互相转换
  3. linux系统tcl电视刷机包,tcl电视刷机包tcl电视升级包系统修复tcl电视强刷包
  4. element分页组件,搜索过后current-page 绑定的数据变了,但是页面当前页码并没有变的问题
  5. 对使用字符指针变量和字符数组的讨论
  6. teracopy php,Unraid 升级到 UnRaid 6.0的详细操作步骤(三)
  7. 搞了一天存储过程,现在又说历史数据不用处理了。。。
  8. 华硕服务器 u盘安装系统,怎样用U盘给华硕电脑装系统3种教程
  9. 书评|《小岛经济学》
  10. 读书笔记(八)--货币战争 金权天下