[譯]5 個奇怪的只會在 JS 裏才發生的趣事

原文連接:xtrp.io/blog/2019/1…javascript


JavaScript 是一門棘手的語言,就其代碼的解析和運行方式,容易讓人感受困惑。這是一門面向對象的語言,但不少年來語言標準裏沒有類。它最初是爲瀏覽器創造的,但如今也能夠在服務器上運行,還能夠操做文件系統。java

多年以來,我碰到了一些特殊且有趣的代碼。下面展現的這些例子僅適用於 JavaScript,我總結了 5 個。git

1. 鏈接數組獲得的是字符串

+ 號鏈接數組獲得的結果是字符串。github

這件使人困惑的事情發生的緣由,在於這裏的兩個數組都被轉爲對象、而後再相加的:編程

[1, 2, 3, 4] + [5, 6, 7, 8]

// 被解釋爲:

"1,2,3,4" + "5,6,7,8"

// 結果以下:

"1,2,3,45,6,7,8"
複製代碼

2. BaNaNa?

下面展現了鏈接值時 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"
複製代碼

3. 這是一段有效的 JS 代碼(稱爲 JSF***

[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[]
)[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[
][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(
[][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(
![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(
!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!
![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][
[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(
![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+[+[]]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+
[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]
])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!
複製代碼

完整代碼太長了,這裏展現了部分,能夠訪問 jsf___example.js 文件查看完整代碼。瀏覽器

是的,這是一段有效的 JS 代碼。在控制檯執行後,會看到下面的結果:服務器

事實證實,任何 JavaScript 函數、字符串、變量或數據類型均可以在 JS 中由 6 個字符的組合表示,並生成徹底有效的現成JavaScript 代碼。 在 Brainf*** 編程語言以後,這個想法被稱爲 JSF***編程語言

你能夠在這個 Github 倉庫裏查看更多關於 JSF*** 的信息。

4. 能夠在 JavaScript 中使用 HTML 註釋

在 JavaScript 中使用 HTML 代碼是徹底有效的,能夠用來替換咱們經常使用的 ///**/ 註釋。實際上,<!----><!-- --> 這些標記在 JavaScript 中什麼事情都不作,會被忽略。

許多 JavaScript 語法高亮器都沒有解釋這個符號。因此,儘管頗有趣,但在 JS 中所有使用 HTML 註釋可能並不實際。

這是由於在 <script> 標籤中使用了 HTML 註釋,那麼那些不支持 JS 的瀏覽器就會忽略它。

固然,這再也不重要了,由於大多數瀏覽器都支持 JavaScript 了,而那些瀏覽器不太可能不顯示 script 標籤的內容,但這仍然是一個有趣的事實。

5. 最小值比 0 大?

許多編程語言都設置了本身可以表達的數字的最小值和最大值。

Python 裏有 sys.maxsize,JavaScript 裏有 Number.MIN_VALUE 常量。

咱們直接打印 Number.MIN_VALUE 看下:

比 0 大!實際上,Number.MIN_VALUE 實際上表示能夠用 JavaScript 中的浮點數表示的最小的正數,而不是最小的負數。

若是你要在代碼裏用的時候,必定要知道這點!

總結

我但願您喜歡這篇文章,而且喜歡這些特別的 JavaScript 示例。 JavaScript 有時是一門很棒但又使人困惑的語言,但願您從本文中學到一點東西。

若是您對這類問題十分感興趣,在 Github 是有一個名爲 WtfJS 的倉庫能夠幫到你,裏面包含了數百個代碼段和對應的說明。

感謝閱讀。

(正文完)


廣告時間(長期有效)

我有一位好朋友開了一間貓舍,在此幫她宣傳一下。如今貓舍裏養的都是布偶貓。若是你也是個貓奴而且有須要的話,不妨掃一掃她的【閒魚】二維碼。不買也沒關係,看看也行。

(完)

相關文章
相關標籤/搜索