阅读 1581

[译]5 个奇怪的只会在 JS 里才发生的趣事

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


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

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

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

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

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

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

这是底层发生的事情:

"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 的仓库可以帮到你,里面包含了数百个代码段和对应的说明。

感谢阅读。

(正文完)


广告时间(长期有效)

我有一位好朋友开了一间猫舍,在此帮她宣传一下。现在猫舍里养的都是布偶猫。如果你也是个猫奴并且有需要的话,不妨扫一扫她的【闲鱼】二维码。不买也不要紧,看看也行。

(完)

关注下面的标签,发现更多相似文章
评论