js里面字符数字和数字相加_「译」5 个奇怪的只会在 JS 里才发生的趣事

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

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

5624b420bb674fe8402a61323bc34cf9.png

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

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

6532040920f5bb20af75840c4b4b864e.png

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

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

91a65413e389d4927c78c1dfb793eb3a.png

这是底层发生的事情:

"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 代码。在控制台执行后,会看到下面的结果:

d465e15c1bb73bd8bdac6706a2989fc8.png

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

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

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

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

e4a47d2c8f1e1854a8ba4186fb368d55.png

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

这是因为在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值