任何人都可以解释一下为什么这个javascript代码警告" 47" ?
var component = +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![]));
alert(component);
当我执行它们时,这些括号,加号等等在结尾处返回47?
如何用PHP编写。我知道这是字符串,布尔等等。但是不能理解它吗?
答案 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 -> 0
,false + true -> 1
,true + true -> 2
。除了作为源表达式之外,不会直接使用这些数组:![] -> false
,!![] -> true
,!+[] -> true
和number + [] -> "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元素:
+[]: 0
![]: true
+![]: 1
!![]: false
+!![]: 0
在PHP中:
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