Javascript 进阶 3-11 Javascript奇怪的运算

这篇文章主要在描述运算子运算出来的 不如预期结果。

有些虽然平常在撰写不会用到,但面试的时候可能会被问到。

有些就真的是会在撰写的过程中遇到的问题,那就让我们以这张图为基础,分门别类来解说其中几个重要的问题。

http://img2.58codes.com/2024/20121770IoGk8NMKkT.jpg

小数点的计算

可以看到

0.5 + 0.1 == 0.6 // ture0.1 + 0.2 == 0.3 // false

为甚么呢,仔细了去查才发现 0.1 + 0.2 回传的结果是 0.30000000000000004。

造成这个的主要原因是,不论哪种语言都是由最低阶的 0 以及 1 组成,而小数点的角色对于 0 和 1 的世界观来看,

也是另一种代码串,并不是本来就有的存在,所以在进行小数点的数字计算时,会有 异位 的情形发生,造成小数点计算上的误差。

要处理这种办法就得先将小数点的数字乘上一个基数,还原成正整数计算完后,再除掉原本的基数还原正确的计算结果。

阵列、物件的相加

[] + [] // ""[] + {} // "[object Object][object Object]"{} + [] // 0{} + {} // "[object Object][object Object]"[] === 0 // false[] == 0 // true

这个就没有甚么特别的规则,就是死背。XDD

数字计算

true + true + true == 1 // truetrue - true == 0 // truetrue == 1 // truetrue === 1 // false9 + '1' // '91'91 - '1' // 90

之前的 隐性转型文章 有说到,在不是严格比对的状况下,布林值以及字串会转型为数字,而 true 就会转型成 数字1。

另外 数字跟字串 相加 会回传字串。

但如果是相减的话,就会回传数字喔!

位元移动(<< 、 >>)

有时候会被问到

8 >> 2 // 28 / 4 // 2

哪一个运算子比较 快?

这个答案其实是 >>/ 要来的快。

这边就不细讲 为什么 8 >> 2 会回传 2,有兴趣的人可以参考 这篇文章 或是自己搜寻计算的方式。

主要的原因是因为 javascript 的运算子计算是针对记忆体位置比较远的一种语言,其中 >> 以及 << 是对记忆体的 0 跟 1进行直接的操作,所以速度很快。

+ - * / 则是先在记忆体较远的地方进行计算完以后才转换为记忆体的32位元二进位储存在记忆体中。所以速度上较慢。

以上就是针对奇怪的地方大致分类的讲解

日后有学到新的也会再~补充内容~

另外还有可以参考的资源: jsfuck

今天就到这里噜~汪汪


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章