Skip to main content

'1'+3=? JavaScript的加法操作把我坑了

· 3 min read

最近写代码的时候,遇到了一个bug。在JavaScript里面,'1'+3=? 在程序中,会根据用户的操作,动态设置一个值,这看起来是个很简单的加法操作,实际也很简单,但是程序就是不对。

调试

于是就在各个地方console.log,但是也没有发现问题,因为没有觉得会是加法这里出现的问题。

用户输入操作的内容,程序获取之后,假设返回的为value,程序里面console.log(vaule),比如用户操作1,可以看到输出的是1,输入获取是正确的。

然后就是value + 3,计算一个新的数值,这不是很简单吗?1+3=4。

于是继续思考着代码,思考了一会之后,在这个value + 3之后,打印出了value+3的内容,输出结果为13,大惊,本来我是知道php里面有一些隐式类型转换的,看到这里,应该就是value是字符串的问题了。

由于console.log打印value时,看到的是1,理所当然地认为value就是一个数字了。

JavaScript加法操作

看一下mdn上面的加法操作符,加法操作符有数字相加和字符串拼接的作用。

  • 如果一边是字符串,另外一边会转化成字符串,然后进行字符串拼接;(这个就是我们遇到的情况)
  • 如果两边都是BigInt,就执行BigInt加法;如果一边是BigInt,一边不是,就报错;
  • 否则,两边都转换为数字,执行数字加法。

总结

所以,问题就明确了,我们的加法,一边是字符串,一边是数字,就转换 为字符串拼接的操作了,因此最后'1'+3='13',被这个JavaScript的加法操作给坑了。

还有一个问题,我去看了一下获取用户操作的文档,文档里面并没有说返回的类型是什么,只说了返回的value是点击的序号的value,我就当成了数字了。

看来,类型模棱两可的地方,还需要自己强制类型转换一下。