这是有效的,并返回"10"
JavaScript中的字符串(此处更多示例):
console.log(++[[]][+[]]+[+[]])
Run Code Online (Sandbox Code Playgroud)
为什么?这里发生了什么?
CodeMash 2012的"Wat"谈话基本上指出了Ruby和JavaScript的一些奇怪的怪癖.
我在http://jsfiddle.net/fe479/9/上做了一个JSFiddle的结果.
下面列出了JavaScript特有的行为(我不知道Ruby).
我在JSFiddle中发现我的一些结果与视频中的结果不一致,我不知道为什么.但是,我很想知道JavaScript在每种情况下如何处理幕后工作.
Empty Array + Empty Array
[] + []
result:
<Empty String>
Run Code Online (Sandbox Code Playgroud)
+
在JavaScript中使用数组时,我对运算符非常好奇.这与视频的结果相匹配.
Empty Array + Object
[] + {}
result:
[Object]
Run Code Online (Sandbox Code Playgroud)
这与视频的结果相匹配.这里发生了什么?为什么这是一个对象.什么是+
运营商吗?
Object + Empty Array
{} + []
result
[Object]
Run Code Online (Sandbox Code Playgroud)
这与视频不符.该视频表明结果是0,而我得到[对象].
Object + Object
{} + {}
result:
[Object][Object]
Run Code Online (Sandbox Code Playgroud)
这与视频不匹配,输出变量如何导致两个对象?也许我的JSFiddle错了.
Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Run Code Online (Sandbox Code Playgroud)
做wat + 1导致wat1wat1wat1wat1
......
我怀疑这只是简单的行为,试图从字符串中减去一个数字导致NaN.
这个问题很难在问题标题中总结出来
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) alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:fail
.为什么?
顺便说一句(![]+[])[+!+[]] == 'false'[1]
,对吗?但为什么![]+[] == "false"
和为什么+!+[] == 1
?
我抓住了一些混淆的JavaScript代码.我试图理解它,并且这样做,我在控制台中输入了它的一部分.我不明白为什么
> ((!!+[]+"")[+!![]])
< "a"
Run Code Online (Sandbox Code Playgroud)
为什么在JavaScript中((!!+[]+"")[+!![]])
等于"a"
?还有其他一些代码片段可以获得其他字母吗?
我想这与自动铸造有关.