JavaScript 是一门棘手的语言,就其代码的解析和运行方式,容易让人感觉困惑。这是一门面向对象的语言,但很多年来语言标准里没有类。它最初是为浏览器创造的,但现在也可以在服务器上运行,还可以操作文件系统。

多年以来,我碰到了一些特殊且有趣的代码。下面展示的这些例子仅适用于 JavaScript,我总结了 5 个。




javascript中数字加字符 javascript数字和字符串相加_字符串


1. 连接数组得到的是字符串

用 + 号连接数组得到的结果是字符串。


javascript中数字加字符 javascript数字和字符串相加_字符串_02


这件令人困惑的事情发生的原因,在于这里的两个数组都被转为对象、然后再相加的:

[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 类型推断机制对结果的影响作用:


javascript中数字加字符 javascript数字和字符串相加_字符串_03


这是底层发生的事情:

"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中数字加字符 javascript数字和字符串相加_数组_04


事实证明,任何 JavaScript 函数、字符串、变量或数据类型都可以在 JS 中由 6 个字符的组合表示,并生成完全有效的现成JavaScript 代码。 在 Brainf*** 编程语言之后,这个想法被称为 JSF***。

你可以在这个 Github 仓库里查看更多关于 JSF*** 的信息。

4. 可以在 JavaScript 中使用 HTML 注释

在 JavaScript 中使用 HTML 代码是完全有效的,可以用来替换我们常用的 // 或 /**/ 注释。实际上, 和 这些标记在 JavaScript 中什么事情都不做,会被忽略。


javascript中数字加字符 javascript数字和字符串相加_数组_05


许多 JavaScript 语法高亮器都没有解释这个符号。所以,尽管很有趣,但在 JS 中全部使用 HTML 注释可能并不实际。

这是因为在