「譯」5 個奇怪的只會在 JS 裡才發生的趣事

JavaScript 是一門棘手的語言,就其代碼的解析和運行方式,容易讓人感覺困惑。這是一門面向對象的語言,但很多年來語言標準裡沒有類。它最初是為瀏覽器創造的,但現在也可以在服務器上運行,還可以操作文件系統。

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


「譯」5 個奇怪的只會在 JS 裡才發生的趣事


1. 連接數組得到的是字符串

用 + 號連接數組得到的結果是字符串。


「譯」5 個奇怪的只會在 JS 裡才發生的趣事


這件令人困惑的事情發生的原因,在於這裡的兩個數組都被轉為對象、然後再相加的:

<code>[ ] + [

5

,

6

,

7

,

8

]

"1,2,3,4"

+

"5,6,7,8"

"1,2,3,45,6,7,8"

/<code>


2. BaNaNa?

下面展示了連接值時 JavaScript 類型推斷機制對結果的影響作用:


「譯」5 個奇怪的只會在 JS 裡才發生的趣事


這是底層發生的事情:

<code>

"b"

+

"a"

+ +

"a"

+

"a"

"b"

+

"a"

+ (+

"a"

) +

"a"

"b"

+

"a"

+

NaN

+

"a"

"b"

+

"a"

+

"NaN"

+

"a"

"baNaNa"

/<code>


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

<code>[

][

(![

]+[

])[

+[

]]+([

![

]]+[

][

[

]])[

+!![

]+[

+[

]]]+(![

]+[

])[

!![

]+!![

]]+(![

]+[

])[

!![

]+!![

]]][

([

]+[][(![]+[] )[

+[

]]+([

![

]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[ ][

(![

]+[

])[

+[

]]+([

![

]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+( [

][

[

]]+[

])[

+!![

]]+(![

]+[

])[

!![

]+!![

]+!![

]]+(!![

]+[

])[

+[

]]+(!![

]+[

])[

+!![

]]+([][[]]+[])[+[]]+([]+[][( ![

]+[

])[

+[

]]+([

![

]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+( !![

]+[

])[

+[

]]+(!![

]+[

][

(![

]+[

])[

+[

]]+([

![

]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+! ![

]]])[

+!![

]+[

+[

]]]+(!![

]+[

])[

+!![

]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][ [

]]+[

])[

+[

]]+(!![

]+[

])[

+!![

]]+([

][

[

]]+[

])[

+!![

]]+(![

]+[

][

(![

]+[

])[

+[

]]+([

![

]]+[][[]])[+!![]+[+[]]]+( ![

]+[

])[

!![

]+!![

]]+(![

]+[

])[

!![

]+!![

]]])[

!![

]+!![

]+[

+[

]]]+([

]+[

][

(![

]+[

])[

+[

]]+([

![

]]+[][[]])[+!![]+ [

+[

]]]+(![

]+[

])[

!![

]+!![

]]+(![

]+[

])[

!![

]+!![

]]])[

!![

]+!![

]+!![

]]+(!![

]+[

][

(![

]+[

])[

+[

]]+([

![

]]+[][[] ])[

+!![

]+[

+[

]]]+(![

]+[

])[

!![

]+!![

]]+(![

]+[

])[

!![

]+!![

]]])[

+!![

]+[

+[

]]]+([][[]]+[])[+!![]]+(![]+[])[!/<code>

完整代碼太長了,這裡展示了部分,可以訪問 jsf___example.js 文件查看完整代碼。

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


「譯」5 個奇怪的只會在 JS 裡才發生的趣事


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

你可以在這個 Github 倉庫裡查看更多關於 JSF*** 的信息。


4. 可以在 JavaScript 中使用 HTML 註釋

在 JavaScript 中使用 HTML 代碼是完全有效的,可以用來替換我們常用的 // 或 /**/ 註釋。實際上, 和 這些標記在 JavaScript 中什麼事情都不做,會被忽略。


「譯」5 個奇怪的只會在 JS 裡才發生的趣事


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

這是因為在


分享到:


相關文章: