括号,真实,错误的理解

时间:2014-08-10 17:55:10

标签: javascript php obfuscation

任何人都可以解释一下为什么这个javascript代码警告" 47" ?

var component = +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![]));
alert(component);

当我执行它们时,这些括号,加号等等在结尾处返回47?

如何用PHP编写。我知道这是字符串,布尔等等。但是不能理解它吗?

5 个答案:

答案 0 :(得分:1)

false       =>  ![] 

true        =>  !![] 

undefined    =>  [][[]] 

NaN          =>  +[![]] 

0            =>  +[] 

1            =>  +!+[] 

2            =>  !+[]+!+[] 

10           =>  [+!+[]]+[+[]] 

Array        =>  [] 

Number      =>  +[] 

String       =>  []+[] 

Boolean      =>  ![] 

Function     =>  []["filter"] 

eval         =>  []["filter"]["constructor"]( CODE )()

window      =>  []["filter"]["constructor"]("return this")()

如果你使用这些转换,几乎所有的javascript都可以变成令人难以置信的难以阅读的废话。这是愚蠢的,但可以做到。

所以以10为例:

[+!+[]]+[+[]] 

这实际上是两个组成部分:

[+!+[]]

and

[+[]] 

这只是[1][0]。但是如果我们将它们加在一起,它们会被转换成字符串,所以我们得到“1”+“0”,这给了我们“10”。

对于你的问题:

+((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![]));

我将分解4个组成部分:

(!+[] + !![] + !![] + !![] + [])

true + true + true + true + array

如果你在控制台中运行它,那就给你4.最后一个[]对这个部分什么都不做,但它强制将类型转换为字符串,这对下一部分很重要。

然后,下一个变为

true + true + true + true + true + true + true

给你7。

所以你得到4 + [] + 7,因为+ [] +迫使类型转换为字符串,所以得到“47”。

要在PHP中执行此操作,您可以执行以下操作:

$x = (![] + ![] + ![] + ![]) . (![] + ![] + ![] + ![] + ![] + ![] + ![]);
//$x is now 47

答案 1 :(得分:1)

在JavaScript中,false + false -> 0false + true -> 1true + true -> 2。除了作为源表达式之外,不会直接使用这些数组:![] -> false!![] -> true!+[] -> truenumber + [] -> "number"

因此我们有(其中t = true,f = false):

+((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![]));

+((t + t + t + t + []) + (t + t + t + t + t + t + t));

+((4 + []) + (7));

现在,请参阅4 + []?转换后将其作为字符串 concatenation 处理,结果为“4”,所以:

+(("4") + (7))

+("4" + 7)

+("47")

47

我不知道这个特定的部分将如何转换为PHP。

答案 2 :(得分:1)

在JS中:

  • []是一个空数组
  • !意思是"不是"在js中,所以如果它之后的值为真,那么它 变得虚假,反之亦然
  • " +"在js中的布尔值前面是一元加号。它转换了 值为整数。 How do I convert a string into an integer in JavaScript?

JS元素:

+[]: 0
![]: true
+![]: 1
!![]: false
+!![]: 0

在PHP中:

  • array()是一个空数组
  • !意味着"不是",所以它转换为true为false,反之亦然,如js
  • (int)会将布尔值转换为整数,就像js中的+做的那样。

PHP元素:

(int) empty(array()): 0
empty(array()): true
(int) empty(array()): 1
!empty(array()): false
(int) !empty(array()): 0

现在全部添加。祝你好运。

答案 3 :(得分:1)

有很多事情需要逐一分析,让我们开始:

假设

var p = [];
console.log(typeof p) // => object (array) 
console.log(p) //=> []

再次,

var p = +[]; 
console.log(typeof p) //=> number 
console.log(p) //=> 0

再次,

var p = ![]; 
console.log(typeof p); //boolean
console.log(p); //false 

再次,

var p =   !![];
console.log(typeof p); // boolean
console.log(p); //true

再次,

var p =   !+[];
console.log(typeof p);  //boolean
console.log(p);  //true

现在

boolean true ==> 1
boolean false ==> 0 

所以,

var p =  (
   !+[] + 
   !![] + 
   !![] + 
   !![] + 
   []
 );
console.log(typeof p); //string 
console.log(p); // 4 

并且

var p = (
    !+[] + 
    !![] + 
    !![] + 
    !![] + 
    !![] + 
    !![] + 
    !![]
  );
console.log(typeof p); //number 
console.log(p);  // 7 

最后:

var p = +(
 (
   !+[] + 
   !![] + 
   !![] + 
   !![] + 
   []
 ) + 

  (
    !+[] + 
    !![] + 
    !![] + 
    !![] + 
    !![] + 
    !![] + 
    !![]
  )

);
console.log(typeof p); //Number
console.log(p); //47

您可以在php中使用array,boolean(negation!)编写相同的内容。

答案 4 :(得分:0)

+[] -> 0 //Because + converts all other javascript types to numbers
!+[] -> true //Because ! converts 0 to true
![] -> false //Empty array is true 
!![] -> true //Because ![] is false

(!+[] + !![] + !![] + !![] + []) -> true+true+true+true+""="4"

+布尔值转换为 1 (如果它是true), 0 (如果它是false 1}}。`

这是字符串值,因为Number + Empty object会创建字符串,因为空对象无法转换为Number,它会转换为String。正如我们所知Number+String->String

因此: (!+[] + !![] + !![] + !![] + []) "4"相同

以同样的方式

(!+[] + !![] + !![] + !![] + !![] + !![] + !![]) -> true+true+true+true+true+true+true = 7 //this is a Number, because Boolean value converts to a Number: either 0 or 1    

最后

"4"+7=47