KyleBlog.cn 文章 标签 关于
文章 标签 关于

JS的字符串和数字进行四则运算时的怪相,其背后原因令人暖心

JavaScript的初学者经常遇到一个问题:字符串和数字居然可以进行四则运算,而且计算规则还很令人困惑。本文的重点是,理解这个怪相背后的设计思路。

理解设计思路后,更容易记忆相关规则,省得每隔一段时间遇到问题时又要回头查资料。

字符串和数字进行四则运算的规则梳理

  1. 数字和数字做“+”运算时,“+”表示加法。字符串和字符串做“+”运算时,“+”表示拼接。
  2. 数字和字符串做“+”运算时,“+”表示字符串拼接。数字和字符串的先后顺序不影响本规则。
  3. 数字和字符串做“+”以外的四则运算(减乘除)时,字符串会被转换为数字后参与计算。如果字符串无法被转换为数字,则计算结果一律为NaN。

背后的设计思路

首先,要理解JS中的很多诡异行为,一定要明确JS的历史和使用场景。在JS刚诞生的年代,它的使用场景就是在浏览器上执行简单的DOM操作,从而让网页变得更加“动态”。传统语言,比如C++大多是很严谨的,有点异常就会报错、停止运行。JS用于简单的脚本,不需要这么严谨,它的原则是能不报错就不报错。在这个思路的指导下,js的容错性是很高的。换在传统语言里根本无法执行的代码,在js下可能就可以执行。

回到正题,在“高容错”的思想指导下再来看待字符串数字混算时的3个规则:

规则1 数字和数字做“+”运算时,“+”表示加法。字符串和字符串做“+”运算时,“+”表示拼接。

规则1没啥好说的,符合大家的直觉。

规则2 数字和字符串做“+”运算时,“+”表示字符串拼接。数字和字符串的先后顺序不影响本规则。

既有数字又有字符串,那么该怎么解释“+”,是加法还是拼接?
JS的思路是,数字一定是数字,而字符串的内容有可能是数字,也可能是非数字。那么,如果把“+”解释为加法,则有可能异常(数字和非数字无法相加);如果把“+”解释为拼接,那么一定可以成功(数字一定可以被转换成字符串)。

规则3 数字和字符串做“+”以外的四则运算(减乘除)时,字符串会被转换为数字后参与计算。如果字符串无法被转换为数字,则计算结果一律为NaN。

字符串本身逻辑上根本没法做“减乘除”运算,所以JS只能把字符串强行转换为数字。但是有些字符串,比如“abc”显然不能转换成正常数字,JS用NaN来表示这种异常数字。然后,正常数字和NaN做“减乘除”运算,得到的依然是异常数字NaN。
顺带一提,JS引入“NaN”的概念,也是出于“高容错”的目的,换别的语言,碰到无法计算的情况,直接就抛异常了。

本文为kyleblog.cn原创,转载请注明出处:https://www.kyleblog.cn/posts/js_number_str

发布日期:2022-08-15 联系作者