Javascript基础之-强制类型转换(二)
上一章主要讲了转换到数字,字符串和布尔类型的一些知识点,那么这一讲接着上面的继续讲。
思考下面这个问题:
console.log(+"123"); // 123 console.log(-"123"); // -123 console.log(+"abc"); // NaN console.log(-"abc"); // NaN
+这个很容易理解,就是把字符串转成了数字,而-这个呢,除了把字符串转为数字以外,还会吧这个数字加否。所以无论+还是-都会进行类型转换,唯一的区别,就是-会置否而+不会。
那么+除了当作一元运算符外,还有一个更广为人知的就是作为加法运算符。
那么加法运算符的话,实际上是有两种可能性的,一种是字符串的拼接,另一种就是做运算。接下来咱们就对这方面详细的讲解一下。
先说结论,如果在+的其中有一个操作数是字符串或者可以转为字符串的话,那么就进行字符串拼接。
反之,如果俩都是数字的话,则进行加法运算。
这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的,
那么如果是引用数据类型,则先转为基本数据类型,再进行比较。
如果是布尔呢,如果加法的另一边是数字的话,那么他就会转为数字,如果是字符串的话,就直接拼接啦.
上面说了一大堆的理论的东西,想必大家看着也累了。来上例子。
console.log(true + 11); // 12 console.log(true + false); // 1 console.log(true + '11'); // "true11"
这个很明显可以看出,如果操作数是数字的话,或者说,操作数都是字符串的话,那么布尔值会先转为数字,再进行拼接操作,如果有一个操作数是字符串的话,那就不转啦,直接拼接。
那么如果是对象类型,它是先转为基本数据类型,怎么转呢,其实就是先调用valueOf,如果valueOf不存在,或者返回的不是基本数据类型,就调用toString,如果toString也没有或者是返回的不是基本数据类型呢,那估计就直接报错了,看例子。
var obj = { valueOf() { return [2, 3]; }, toString() { return "sss"; } } var obj1 = { valueOf() { return 111; }, toString() { return "abc"; } } var obj2 = { valueOf() { return []; }, toString() { return { abc: 'liuhaitao', } } } console.log(obj + 1); // "sss1" console.log(obj1 + 1); // 112 console.log(obj2 + 1); // "Cannot convert object to primitive value"
那么下面一个例子就很容易理解了。
console.log([1].valueOf()); // [1] console.log([1] + [2]); // 12
因为数组的valueOf的值依然为数组,所以他们转的时候,就会调用toString,所以就转成了字符串啦,俩字符串进行拼接,得到最终结果
减法运算符(-)
很显然,减法运算符就是做减法的,他很单纯,就只是做减法,但是呢,这个有一个知识点,就是,减法里的操作数,如果不是数字的话,那么会先转为数字类型的。
console.log("123" - 0); // 123 console.log([3] - [1]); // 2 console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1
这个很明显,第一个和第二个的结果都是转为了数字再进行运算的,那第三个呢,其实这个就是对象的转化方式,如果有valueOf的话,会先执行valueOf找出基本类型值,没有或者不是基本类型值就找toString,最后呢,吧基本类型值转为数字再进行减法运算 。
好了,加法和减法都说完了,那么乘法和除法呢,其实和减法类似,都是转为数字这样的。
console.log("123" * 0); // 0 console.log([3] * [1]); // 3 console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6
想看乘法和除法其他的细节和本文关系不是太大,所以就不细讲了,详情请查阅文档ecma文档:
https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.1
https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.2
还有本节最后一部分,就是有关于逻辑与(&&)和逻辑或(||)
为啥要特地介绍他俩呢,因为他俩的语法和其他语言的语法特性似乎有那么一些区别。来看代码
var a = 42; var b = "abc"; var c = null; console.log(a || b); // 42 console.log(a && b); // "abc" console.log(c || b); // "abc" console.log(c && b); // null
这一块可以看出,他和其他语言的不同之处在于,他的运算的结果,并不是true和false,而是具体的值,也就是说
||符号的时候,如果第一个操作数是true,则返回第一个操作数,如果是false返回第二个,
&&相反,如果第一个操作数是true,则返回第二个操作数,如果是false则返回第一个。
那这个有啥用呢?
其实可以利用这个的特性简化我们的代码,比如说
function exec () { console.log('exec'); } true && exec(); // exec var a = undefined; var b = a || 10; console.log(b); // 10
这个代表了应用的两个方面,&&可以做函数执行的前置判断,后面那个呢,可以做缺省时的默认值,你可以仔细观察一下,在一些压缩代码工具,压缩完后的代码,很多都把if 条件判断改成了&&,这次知道原因了吧。
参考书籍《你不知道的Javascript中卷》
参考文章:https://codeburst.io/javascript-why-does-3-true-4-and-7-other-tricky-equations-9dd13cb2a92a

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Guidelines for Function Compute Development - Troubleshoot Timeout Iss...
Endless codes and endless bugs When you write code, you may inadvertently introduce some hidden bugs, even if you test a large proportion of the codes to the maximum extent possible.It takes a sort of skill to write codes with bugs that are hidden or look like features, pass all processes (including testing and review), and are finally merged into the trunk. This docume
- 下一篇
大数据环境下计算机软件技术分析
随着我国信息科技的不断发展,我国社会已经逐渐迈入了信息化时代,信息化时代最主要的特征就是建立以大数据为代表的信息技术平台。大数据环境下网络信息的整合能力,信息资源的共享能力越来越强,对计算机软件技术的应用要求也越来越高。 目前基于大数据的计算机软件技术在各行各业中都有着广泛的应用,尤其是体现在企业的运营管理当中,运用计算机软件技术能够大大提高对信息数据的处理能力,帮助企业实现快速的数据分析,同时也能在计算机技术的应用过程中发现计算机软件技术中存在的不足,从而更好的完善该项技术。本文就主要针对大数据环境下计算机软件技术进行分析研究。 随着大数据时代的到来,基于大数据平台的计算机软件技术也获得了更大的发展空间,给计算机软件技术的创新提供了新的发展方向和路径。近年来,国家大力扶持计算机软件开发项目,很多计算机软件产业园不断地发展壮大,使得计
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16