原文連接:xtrp.io/blog/2019/1…javascript
JavaScript 是一門棘手的語言,就其代碼的解析和運行方式,容易讓人感受困惑。這是一門面向對象的語言,但不少年來語言標準裏沒有類。它最初是爲瀏覽器創造的,但如今也能夠在服務器上運行,還能夠操做文件系統。java
多年以來,我碰到了一些特殊且有趣的代碼。下面展現的這些例子僅適用於 JavaScript,我總結了 5 個。git
用 +
號鏈接數組獲得的結果是字符串。github
這件使人困惑的事情發生的緣由,在於這裏的兩個數組都被轉爲對象、而後再相加的:編程
[1, 2, 3, 4] + [5, 6, 7, 8]
// 被解釋爲:
"1,2,3,4" + "5,6,7,8"
// 結果以下:
"1,2,3,45,6,7,8"
複製代碼
下面展現了鏈接值時 JavaScript 類型推斷機制對結果的影響做用:api
這是底層發生的事情:數組
"b" + "a" + + "a" + "a"
// 被解釋爲:
"b" + "a" + (+"a") + "a"
// (+"a") 覺得以 + 開頭,所以這是要把 "a" 轉爲數字,
// 但 "a" 是不能正確轉爲數字的,所以結果是 NaN (not a number):
"b" + "a" + NaN + "a"
// NaN 在鏈接的時候轉成了字符串,變成 "NaN" 了:
"b" + "a" + "NaN" + "a"
// 如下就是最終的鏈接結果了:
"baNaNa"
複製代碼
JSF***
)[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[]
)[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[
][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(
[][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(
![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(
!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!
![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][
[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(
![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+[+[]]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+
[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]
])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!
複製代碼
完整代碼太長了,這裏展現了部分,能夠訪問 jsf___example.js 文件查看完整代碼。瀏覽器
是的,這是一段有效的 JS 代碼。在控制檯執行後,會看到下面的結果:服務器
事實證實,任何 JavaScript 函數、字符串、變量或數據類型均可以在 JS 中由 6 個字符的組合表示,並生成徹底有效的現成JavaScript 代碼。 在 Brainf***
編程語言以後,這個想法被稱爲 JSF***
。編程語言
你能夠在這個 Github 倉庫裏查看更多關於 JSF***
的信息。
在 JavaScript 中使用 HTML 代碼是徹底有效的,能夠用來替換咱們經常使用的 //
或 /**/
註釋。實際上,<!--
、-->
和 <!-- -->
這些標記在 JavaScript 中什麼事情都不作,會被忽略。
許多 JavaScript 語法高亮器都沒有解釋這個符號。因此,儘管頗有趣,但在 JS 中所有使用 HTML 註釋可能並不實際。
這是由於在 <script>
標籤中使用了 HTML 註釋,那麼那些不支持 JS 的瀏覽器就會忽略它。
固然,這再也不重要了,由於大多數瀏覽器都支持 JavaScript 了,而那些瀏覽器不太可能不顯示 script
標籤的內容,但這仍然是一個有趣的事實。
許多編程語言都設置了本身可以表達的數字的最小值和最大值。
Python 裏有 sys.maxsize
,JavaScript 裏有 Number.MIN_VALUE
常量。
咱們直接打印 Number.MIN_VALUE 看下:
比 0 大!實際上,Number.MIN_VALUE 實際上表示能夠用 JavaScript 中的浮點數表示的最小的正數,而不是最小的負數。
若是你要在代碼裏用的時候,必定要知道這點!
我但願您喜歡這篇文章,而且喜歡這些特別的 JavaScript 示例。 JavaScript 有時是一門很棒但又使人困惑的語言,但願您從本文中學到一點東西。
若是您對這類問題十分感興趣,在 Github 是有一個名爲 WtfJS 的倉庫能夠幫到你,裏面包含了數百個代碼段和對應的說明。
感謝閱讀。
(正文完)
廣告時間(長期有效)
我有一位好朋友開了一間貓舍,在此幫她宣傳一下。如今貓舍裏養的都是布偶貓。若是你也是個貓奴而且有須要的話,不妨掃一掃她的【閒魚】二維碼。不買也沒關係,看看也行。
(完)