【问题标题】:Does anyone know what this in Javascript means? `ǀǀ+(ǀ==ǀ-->ǀ+ǀ<--ǀ==ǀ)+ǀǀ`有谁知道 Javascript 中的 this 是什么意思? `ǀǀ+(ǀ==ǀ-->ǀ+ǀ<--ǀ==ǀ)+ǀǀ`
【发布时间】:2017-06-09 21:49:56
【问题描述】:

所以我在一个网站上查看某人的代码,然后环顾四周,我看到了这个:

var ǀ = 1;
var ǀǀ = 21;
var s = ǀǀ+(ǀ==ǀ-->ǀ+ǀ<--ǀ==ǀ)+ǀǀ;
document.writeln(s);

这在某种程度上等于 42?有谁知道他们是怎么做到的?我以为||和 | or在哪里?

【问题讨论】:

标签: javascript


【解决方案1】:

他们正在 (ab) 使用一个看起来很像竖线 (|) 的字符,例如“或”中使用的字符 (||)。

你可以这样重写他们的代码:

var a = 1;
var b = 21;
var s = b + (a == a-- > a + a < --a == a) + b;
document.writeln(s);

或进一步简化:

var s = 21 + (1 == 1 > 0 + 0 < -1 == -1) + 21;
document.writeln(s);

// Even further simplified
var s = 21 + (true > false < true) + 21;
document.writeln(s);

// Clean up that middle case
var s = 21 + (false) + 21;
document.writeln(s);

// Coerce to a number
var s = 21 + 0 + 21;
document.writeln(s);

// Last simplification
var s = 21 + 21;
document.writeln(s);

没有特殊的运算符。只是普通的变量名与看起来很奇怪的变量名混合在一起。

【讨论】:

    【解决方案2】:

    ǀǀǀ 是 (Unicode) 变量名称。

    空格:

    var ǀ = 1;
    var ǀǀ = 21;
    var s = ǀǀ + (ǀ == ǀ-- > ǀ + ǀ < --ǀ == ǀ) + ǀǀ;
    

    应用运算符优先级和关联性:

    var ǀ = 1;
    var ǀǀ = 21;
    var s = (ǀǀ + ((ǀ == ((ǀ-- > (ǀ + ǀ)) < --ǀ)) == ǀ)) + ǀǀ;
    

    应用评估顺序:

    var a = ǀǀ + ((ǀ == ((ǀ-- > (ǀ + ǀ)) < --ǀ)) == ǀ);
    var s = a + ǀǀ;
    
    var b = (ǀ == ((ǀ-- > (ǀ + ǀ)) < --ǀ)) == ǀ;
    var a = ǀǀ + b;
    
    var c = ǀ == ((ǀ-- > (ǀ + ǀ)) < --ǀ);
    var b = c == ǀ;
    
    var d = (ǀ-- > (ǀ + ǀ)) < --ǀ;
    var c = ǀ == d;
    
    var e = ǀ-- > (ǀ + ǀ);
    var d = e < --ǀ;
    
    var g = ǀ--;
    var f = ǀ + ǀ;
    var e = g > f;
    

    评估:

    var ǀ = 1;
    var ǀǀ = 21;
    
    var g = ǀ--;
    var f = ǀ + ǀ;
    var e = g > f;
    var d = e < --ǀ;
    var c = ǀ == d;
    var b = c == ǀ;
    var a = ǀǀ + b;
    var s = a + ǀǀ;
    
    var ǀ = 0;
    var ǀǀ = 21;
    
    var g = 1;
    var f = ǀ + ǀ;
    
    var ǀ = 0;
    var ǀǀ = 21;
    
    var f = 0 + 0;
    var e = g > f;
    
    var ǀ = 0;
    var ǀǀ = 21;
    
    var e = 1 > 0;  // true
    var d = e < --ǀ;
    
    var ǀ = -1;
    var ǀǀ = 21;
    
    var d = true < -1;  // false
    var c = ǀ == d;
    
    var ǀ = -1;
    var ǀǀ = 21;
    
    var c = -1 == -1;  // true
    var b = c == ǀ;
    
    var ǀ = -1;
    var ǀǀ = 21;
    
    var b = true == -1;  // false
    var a = ǀǀ + b;
    
    var ǀ = -1;
    var ǀǀ = 21;
    
    var a = 21 + false;  // 21
    var s = a + ǀǀ;
    
    var ǀ = -1;
    var ǀǀ = 21;
    
    var s = 21 + 21;  // 42
    

    【讨论】:

      【解决方案3】:

      这是一个笑话(一个坏笑话)。它不是运营商。它是一组变量和运算符的集合,故意使之看起来令人困惑。

      它利用了ǀ (U+01C0 : LATIN LETTER DENTAL CLICK {pipe}) 和| (U+007C : VERTICAL LINE {vertical bar}) 是一个运算符。

      【讨论】:

        【解决方案4】:

        这是混淆和弱类型滥用的混合体。

        首先,ǀǀǀ 这里只是具有有趣名称的变量 - 名称看起来有点像,但实际上不是通用字符 |应该一个运营商。所以让我们把它们换掉:

        var a = 1;
        var b = 21;
        var s = b+(a==a-->a+a<--a==a)+b;
        document.writeln(s);
        

        现在我们在一条线上有各种操作,我们需要计算出the precedence of the different operators,这样我们才能按正确的顺序分解它。我们拥有的运算符,按优先级从高到低的顺序是:

        • (...) 赋予部分更高的优先级
        • 后缀--
        • 前缀--
        • +
        • &gt;&lt;(从左到右)
        • ==(多次,从左到右)

        所以我们可以按这个顺序计算总和:

        • 括号内的部分是唯一有趣的部分,其余为21 + (something) + 21
        • a-- 给出 1,但将 a 更改为 0 (b+(a==1&gt;a+a&lt;--a==a)+b)
        • --aa 更改为 -1 并给出 -1 (b+(a==1&gt;a+a&lt;-1==a)+b)
        • a 现在是 -1,所以中间变成了 -1+-1 (b+(a==1&gt;-1+-1&lt;-1==a)+b),即 -2 (b+(a==1&gt;-2&lt;-1==a)+b)
        • 1&gt;-2true (b+(a==true&lt;-1==a)+b)
        • true&lt;-1false 因为 true 被视为 1 (b+(a==false==a)+b)
        • a-1,但false0,所以a==false 就像说-1==0,即false (b+(false==a)+b)
        • false==a 又是false (b+(false)+b)
        • 被视为一个数字,false 是 0,所以 b + 0 + b21 + 0 + 2142

        有趣的是,a 的就地修改使得它可以进行各种解释。例如,可能所有未修改的as 都被替换为1(即在a++ 之前),给出了一些变化:

        • a1,最中间的是1+1 (b+(a==1&gt;1+1&lt;-1==a)+b),即0 (b+(a==1&gt;2&lt;-1==a)+b)
        • 1&gt;2false (b+(a==false&lt;-1==a)+b)
        • 但是,false&lt;-1 仍然是 false,所以我们回到原来的序列

        【讨论】:

          猜你喜欢
          • 2017-12-29
          • 2013-11-03
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多