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

时间:2014-09-02 11:22:42

标签: programming-languages

我的一位同事给我发了一段代码,上面只有括号()[] {},以及标志和惊叹号。

[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]] 

它继续这样......

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

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

2 个答案:

答案 0 :(得分:8)

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

以下是简短摘要:
使这项工作的主要技巧是类型转换:
[]是一个空数组 +[] === 0将此空数组转换为数字,即零 !+[] === true然后将零转换为false并将其否定为真 !+[]+!+[] === 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函数。它可以用于构造任意匿名函数,并使用代码作为输入的字符串。最后,我们使用()

调用我们新创建的函数

答案 1 :(得分:0)

它叫做JSFuck。在下面查看此链接。

JSFuck编码器:http://www.jsfuck.com/

解码JSFuck:How to decode a JSFuck script? https://enkhee-osiris.github.io/Decoder-JSFuck/