这篇文章主要在描述运算子运算出来的 不如预期结果。
有些虽然平常在撰写不会用到,但面试的时候可能会被问到。
有些就真的是会在撰写的过程中遇到的问题,那就让我们以这张图为基础,分门别类来解说其中几个重要的问题。
小数点的计算
可以看到
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
今天就到这里噜~汪汪