JavaScript 是一門棘手的語言,就其代碼的解析和運行方式,容易讓人感覺困惑。這是一門面向對象的語言,但很多年來語言標準裡沒有類。它最初是為瀏覽器創造的,但現在也可以在服務器上運行,還可以操作文件系統。
多年以來,我碰到了一些特殊且有趣的代碼。下面展示的這些例子僅適用於 JavaScript,我總結了 5 個。
1. 連接數組得到的是字符串
用 + 號連接數組得到的結果是字符串。
這件令人困惑的事情發生的原因,在於這裡的兩個數組都被轉為對象、然後再相加的:
<code>[ ] + [5
,6
,7
,8
]"1,2,3,4"
+"5,6,7,8"
"1,2,3,45,6,7,8"
/<code>
2. BaNaNa?
下面展示了連接值時 JavaScript 類型推斷機制對結果的影響作用:
這是底層發生的事情:
<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 代碼。在控制檯執行後,會看到下面的結果:
事實證明,任何 JavaScript 函數、字符串、變量或數據類型都可以在 JS 中由 6 個字符的組合表示,並生成完全有效的現成JavaScript 代碼。 在 Brainf*** 編程語言之後,這個想法被稱為 JSF***。
你可以在這個 Github 倉庫裡查看更多關於 JSF*** 的信息。
4. 可以在 JavaScript 中使用 HTML 註釋
在 JavaScript 中使用 HTML 代碼是完全有效的,可以用來替換我們常用的 // 或 /**/ 註釋。實際上, 和 這些標記在 JavaScript 中什麼事情都不做,會被忽略。
許多 JavaScript 語法高亮器都沒有解釋這個符號。所以,儘管很有趣,但在 JS 中全部使用 HTML 註釋可能並不實際。
這是因為在