代码之家  ›  专栏  ›  技术社区  ›  Eugenio Laghi

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

  •  7
  • Eugenio Laghi  · 技术社区  · 10 年前

    我的一位同事给我发了一段仅由括号()[]{}、加号和感叹号组成的代码。

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

    然后就这样。。

    这隐约让我想起 Brainfuck ,但我找不到任何像这样的深奥语言。

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

    2 回复  |  直到 10 年前
        1
  •  17
  •   Patrick Bender    9 年前

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

    下面是一个简短的总结:
    这项工作的主要技巧是打字:
    [] 是空数组
    +[] === 0 将此空数组强制转换为数字,即零
    !+[] === true 然后将0转换为false并将其否定为true
    !+[]+!+[] === 2 基本上是添加true+true。因此将真值铸造为1,然后相加。这样你可以得到任意的数字。

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

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

    然后你仍然没有任意的字符,但是从这里有几种方法可以得到它们。例如,如果您以浏览器为目标,则可以使用 btoa 功能( 波托阿 将字符串作为输入并返回其base64编码版本)以获得任意ASCII字符。

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

        2
  •  2
  •   JuanDHacker    4 年前