语言仅由括号,加号和感叹号组成

Eug*_*ghi 5 programming-languages

我的一位同事给我发了一段代码,只用括号()[] {},加上标志和惊叹号.

[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]] 
Run Code Online (Sandbox Code Playgroud)

它继续这样..

这模糊地让我想起了Brainfuck,但我找不到像这样写的任何深奥的语言.

你能帮我理解它是什么语言吗?

小智 8

此链接很好地解释了这种JavaScript代码的工作原理:http: //patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html

这里有一个简短的总结:
使这项工作的主要技巧是类型转换:
[]是一个空数组
+[] === 0将这个空数组转换为数字,即零
!+[] === true然后将零转换为false并将其否定为true
!+[]+!+[] === 2基本上是添加true + true.因此,将真实状态转换为1,然后添加.这样你就可以获得任意数字.

但数字还不足以编程,对吗?
[]+{} === "[object Object]"我们可以通过向{}任意事物(例如空数组([]))添加空对象()来获取字符串.
([]+{})[+!+[]] === "o"然后我们可以通过对该字符串("abc"[1] == "b")进行数组访问来获取字符串的第二个字符.

但我们仍然限于该字符串中的10个字符.我们可以通过将其他东西转换为字符串来扩展它:(
"undefined" === [][+[]]+[]访问数组的未定义索引),
"NaN" === +{}+[](将对象转换为数字)
"true" === !![]+[],
"false" === ![]+[]

然后你仍然没有任意字符,但从这里有几种方法来获得它们.例如,如果您要定位浏览器,则可以使用该btoa函数(btoa将字符串作为输入并返回其的base64编码版本)以获取任意ASCII字符.

最后一步是执行我们生成的字符串: []["sort"]["constructor"]("OUR_CODE")() 我们首先得到每个数组作为属性的sort函数.然后我们访问sort函数的构造函数,即Function函数.它可以用于构造任意匿名函数,并使用代码作为输入的字符串.最后我们用()调用我们新创建的函数