iT邦幫忙

2

Javascript 進階 3-11 Javascript奇怪的運算

  • 分享至 

  • twitterImage
  •  

這篇文章主要在描述運算子運算出來的 不如預期結果

有些雖然平常在撰寫不會用到,但面試的時候可能會被問到。

有些就真的是會在撰寫的過程中遇到的問題,那就讓我們以這張圖為基礎,分門別類來解說其中幾個重要的問題。

https://ithelp.ithome.com.tw/upload/images/20191226/20121770IoGk8NMKkT.jpg

小數點的計算

可以看到

0.5 + 0.1 == 0.6 // ture
0.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 // true
true - true == 0 // true
true == 1 // true
true === 1 // false

9 + '1' // '91'
91 - '1' // 90

之前的 隱性轉型文章 有說到,在不是嚴格比對的狀況下,布林值以及字串會轉型為數字,而 true 就會轉型成 數字1。

另外 數字跟字串 相加 會回傳字串。

但如果是相減的話,就會回傳數字喔!

位元移動(<< 、 >>)

有時候會被問到

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

哪一個運算子比較 ?

這個答案其實是 >>/ 要來的快。

這邊就不細講 為什麼 8 >> 2 會回傳 2,有興趣的人可以參考 這篇文章 或是自己搜尋計算的方式。

主要的原因是因為 javascript 的運算子計算是針對記憶體位置比較遠的一種語言,其中 >> 以及 << 是對記憶體的 0 跟 1進行直接的操作,所以速度很快。

+ - * / 則是先在記憶體較遠的地方進行計算完以後才轉換為記憶體的32位元二進位儲存在記憶體中。所以速度上較慢。

以上就是針對奇怪的地方大致分類的講解

日後有學到新的也會再~補充內容~

另外還有可以參考的資源: jsfuck

今天就到這裡嚕~汪汪


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言