JS小技巧:当整数遇到小数点产生的奇妙反应
今天在测试使用toString()方法将整数转为二进制时,直接使用了数值字面量调用了toString()方法,结果浏览器报错了。
看到这样的执行结果,脑子有点懵,理所当然的认为浏览器的JS引擎不至于犯这么低级的错误。于是我定下心神,在我有限的认知里努力想找到一个合理的解释。
首先联想我日常开发中使用数值的方式,基本上都是先定义变量,再用定义好的变量去执行一些方法,这样执行是没有问题的。
这就说明了一点,JS引擎在解析“11.toString”和“num.toString”时有区别,区别就在于前边的“11.”和“num.”,看到前边的"11."突然眼前一亮,这就是小数的表示形式啊,JS中对于数值中的小数点写法是很宽松的,小数点的前边和后边都可以不加数值。
为什么可以这么写呢?源于JS中的数值存储的方式都是以64位的双精度浮点数来存储的,不区分整数和浮点数,整数也是以浮点数的形式存储的。
到这里,整数数值字面量直接调用tostring()方法出错的原因已经基本明了。这里的点产生了混淆,JS引擎无法区分这是小数点还是点引用,既然无法理解点号在当前上下文中的意思,JS引擎怎么办呢,报错吧,让程序员自己去处理吧~好吧,这是我自己臆想了一下浏览器开发商的想法,不过这也很符合实际的应用场景,合情合理。
清楚了原因,那么自然而然就有了应对的解决方案。
方案一:既然无法区分点号,我们就用真正的浮点数代替好了,两个点的怪异语法就此产生了。
这种方式虽然能解决,但也给程序的可读性带来了困难。
方案二:点号之前加一个空格,语法也很奇怪,但会让JS引擎在解释时将点号当作点引用。
注意其中的空格,为了显示的清楚一些,我在示例中加了N多空格。这种方式的缺点也是可读性很差。
方案三:加上括号,转化为表达式。
简单直接,而且易读,这是最完美的解决方案,所以强烈推荐大家使用这种方式。
方案四:使用Number转型函数。
这种方式也比较易于理解,可读性也不错,但不如第三种简单直接。
结语
由于JS内置表现Number数据类型的方式,不区分整数和浮点数,导致在显示时JS引擎无法正确的区分点号的作用。幸好有比较人性化的解决方案,可以弥补JS的这一语法缺陷。
八方学者,各有千秋,三人之行,必有我师~欢迎大家多多留言拍砖~