这个问题很难在问题标题中总结出来
UPDATE 我创建了构建一个模糊的字符串基于从这个问题中提取的字母输入您的的jsfiddle:您可以访问这里,或将一个要点是更容易?
我最近在这个配置文件中遇到了一些有趣的混淆JavaScript ,看起来像这样:
javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]
Run Code Online (Sandbox Code Playgroud)
很抱歉破坏了惊喜但是当评估它时会返回:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Run Code Online (Sandbox Code Playgroud)
分解时的工作方式是生成一系列消息并从中拉出字母(使用"I"作为示例):
[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"
Run Code Online (Sandbox Code Playgroud)
生成的其他字符串包括:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> …Run Code Online (Sandbox Code Playgroud) 在阅读dzone上发布的这篇文章时,我发现了一段最初由Marcus Lagergren在Twitter上发布的JavaScript片段.
以下代码显然打印字符串 "fail"
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]];
Run Code Online (Sandbox Code Playgroud)
这涉及隐式类型转换,我试图理解这条线的解释方式.
我已经隔离了每个角色
(![]+[])[+[]] 版画 "f"(![]+[])[+!+[]] 版画 "a"([![]]+[][[]])[+!+[]+[+[]]] 版画 "i"(![]+[])[!+[]+!+[]] 版画 "l"我还设法打破了每个字母除外的表达式 "i"
"f"![]空数组是一个对象,它根据ECMAScript的文档,点9.2的计算结果为true当转换为一个boolean,所以这是false
false+[]根据Point 11.6.1,二元+运算符的两个参数都转换为String,因此我们得到"false"+"",它进行求值"false"
+[]如果参数是a,则一元加号运算符会导致ToNumber转换,然后ToPrimitive转换Object.通过调用[[DefaultValue]]对象的内部方法来确定这种转换的结果.如果是空数组,则默认为0.(ECMAScript的文档,章节:11.4.6,9.3,9.1)
"false"[0]我们正在访问索引处的字符0,因此"f"
"a"同样的故事,这里唯一的区别是方括号中的部分中的额外转换(其计算为指向字符串中另一个字符的数字"false"),由使用一元+和!运算符触发.
+[]0 …