整理: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
逻辑或同理。
转载于:https://www.cnblogs.com/yuny/p/7826442.html
整理:JavaScript 各种转型函数与类型转换细节相关推荐
- JavaScript(三)数据类型转换
类型转换 JavaScript中的取值类型非常灵活,如当JavaScript期望使用一个布尔值的时候,你可以提供其它数据类型的,JavaScript将根据需要自行转换数据类型.如下示例: 10 + & ...
- 前端面试整理JavaScript
1.eval是做什么的? 它的功能是把对应的字符串解析成JS代码并运行: 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行). 2. null,undefined 的区别? ...
- 如何用JavaScript的回调函数做出承诺
by Adham El Banhawy 由Adham El Banhawy 如何用JavaScript的回调函数做出承诺 (How to make a Promise out of a Callbac ...
- Javascript中的函数重载-最佳做法
用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- Cordova插件中JavaScript代码与Java的交互细节介绍
在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...
- 转换php script类型,javascript如何实现值的类型转换
本篇文章给大家介绍使用javascript进行值的类型转换的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. JavaScript是松散类型的语言,大多数情况下,运算符和函数会自 ...
- C++函数重载解析细节
Copyright(C)<C++从入门到精通-经典完整版> 函数重载解析细节 函数重载解析过程有三个步骤这些步骤可以总结如下: 1 确定为该调用而考虑的候选函数以及函数调用中的实参表属性 ...
- JavaScript专题(七)类型转换
JavaScript专题之最让人头疼的类型转换 目录 前言 一.类型转换是什么? 二.原始值转换的基本规则 三.对象转字符串和数字 四.常见的类型转换运算符 五.常见的类型转换操作 写在最后 前言 在 ...
最新文章
- 基于 Prometheus、InfluxDB 与 Grafana 打造监控平台
- 如何在 TensorFlow 中用深度学习修复图像?(附论文)
- 六类布线六大注意事项
- YoloAll V2发布,集成所有主流Yolo模型于一身
- matlab空格会消失了,如何在Matlab中自动删除保存的尾随空格?
- 前端学习(482):html之b/s和c/s
- 大数据_MapperReduce_Hbase的优化_高可用 预分区_防止数据倾斜_JAVAAPI创建预分区---Hbase工作笔记0026
- Docker学习笔记_安装和使用Zookeeper
- 8.深入分布式缓存:从原理到实践 --- 分布式Redis
- iOS中TableView小技巧
- Windows内核研究工具
- i8一点通如何加载虚拟光驱玩游戏
- 人社部《专项职业能力证书》如何考取!含金量!证书效力!
- 一次搞懂清晰度、对比度以及锐化的区别
- 将文件从VMWare虚拟机的Linux系统传到U盘
- 英语四六级考试忘记准考证?怎么办?
- k-means+matlab 之辣鸡学算法
- 人脸识别 无法打开相机 笔记本_笔记本电脑提示找不到支持Windows hello人脸的摄像头的解决办法...
- 二元置信椭圆r语言_一般加性模型的简介、应用举例及R语言操作
- 八斗大数据清华班全链路 百度网盘
热门文章
- FastCGI 进程管理器(FPM)
- 电流型和电压模拟量信号有何区别,如何互相转换
- linux系统tcl电视刷机包,tcl电视刷机包tcl电视升级包系统修复tcl电视强刷包
- element分页组件,搜索过后current-page 绑定的数据变了,但是页面当前页码并没有变的问题
- 对使用字符指针变量和字符数组的讨论
- teracopy php,Unraid 升级到 UnRaid 6.0的详细操作步骤(三)
- 搞了一天存储过程,现在又说历史数据不用处理了。。。
- 华硕服务器 u盘安装系统,怎样用U盘给华硕电脑装系统3种教程
- 书评|《小岛经济学》
- 读书笔记(八)--货币战争 金权天下