多年來,JavaScript 一直是我主要的工作語言(當然,現在主要使用的是 TypeScript 😉)。我在 ES6 之前就開始使用它了,那時這門語言感覺比現在「原始」得多——沒有 let 或 const,沒有擴展運算符,沒有 Promise,甚至沒有類,只有原型。
那時候寫 JavaScript 簡直是一團糟,好壞參半——就像坐過山車一樣,你必須真正理解這門語言,才能避免自毀前程。我記得當時讀了很多相關的書。其中讓我印象深刻的是 Kyle Simpson 的《You Don't Know JS》 (後來改名為《You Don't Know JS Yet 》)。你現在仍然可以在 GitHub 上找到它們,它們絕對是 JavaScript 知識的寶庫。
所以現在,當又一個後端同事嘲笑像true + true === 2這樣的 JavaScript 怪癖時,我只能禮貌地微笑點頭……內心卻在吶喊: “這不是很明顯嗎?因為這樣那樣,還有……” xDDD 我以前真的會試著解釋,但通常過了十秒鐘,他們就會像看瘋子一樣盯著我,所以我就放棄了😅
不過,在 dev.to 上,我希望能找到真正想聽我解釋的人😂
我可以寫一篇長文來介紹各種 JavaScript 的奇聞軼事,但不如做成一個週末系列文章呢?如果你喜歡這個想法,就按個讚吧 😉
true + true === 2以下是人們喜歡拿來開玩笑的經典 JavaScript 笑話:
true + true === 2 // true
乍一看,這感覺很荒謬。
兩個布林值相加怎麼會得到一個數字呢?
+ (通常)是一個數值運算子。在 JavaScript 中, +運算子有兩種工作模式:
如果涉及字串 →字串連接
否則 →數值加法
由於true不是字串,JavaScript 假定這是一個數學表達式,並將兩個值都轉換為數字。
true的數值是多少呢?JavaScript 使用名為ToNumber 的標準內部轉換規則。
true → 1
false → 0
所以:
true + true
// becomes
1 + 1
// which equals
2
這並非偶然。許多語言在底層都將布林值視為數值:
Python: True + True === 2
C/C++: true行為等同於1
所以,JavaScript 在這裡並沒有表現出任何獨特的怪異之處——這實際上是電腦科學領域非常正常的現象。
例如:
true * 10 // 10
false * 10 // 0
true - 1 // 0
一旦你了解布林值可以轉換為1和0 ,這裡就沒有什麼是神奇的了。
+執行數值加法,除非涉及字串。
true轉換為1 , false轉換為0
這並非JavaScript的無稽之談──很多語言的行為都類似。
所以, true + true === 2不是 bug……只是邏輯戴著一頂滑稽的帽子而已 😎
原文出處:https://dev.to/sylwia-lask/yes-true-true-2-and-no-javascript-isnt-broken-37p7