这是有效的,并返回"10"JavaScript中的字符串(此处更多示例):
console.log(++[[]][+[]]+[+[]])Run Code Online (Sandbox Code Playgroud)
为什么?这里发生了什么?
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:fail.为什么?
顺便说一句(![]+[])[+!+[]] == 'false'[1],对吗?但为什么![]+[] == "false"和为什么+!+[] == 1?
在阅读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 …
最近我遇到了一个有趣的网站,它说明了一个Javascript Obfuscator:http://bl.ocks.org/jasonsperske/5400283
例如,(([]===[])+/-/)[1]给出a并(1+{})[(1<<1)+1]给出b.
我努力理解这些混淆结果的评估顺序但是徒劳无功.
以(1+{})[(1<<1)+1]作为一个例子,据我所知,<<是按位移位运算和将返回2,所以表达式变为(1+{})[3].但我不明白这是什么意思1+{}和[3].
谷歌对这个问题并不是很有帮助,因为搜索引擎不喜欢括号或斜线,所以如果有重复的问题,我很抱歉.
我已经看到了仅使用运算符并""执行复杂字符串操作的代码示例.基本上,这个想法就是((+"+")+"")[+""]给你一封信N等等.我忘了找到它的地方,而且我没有找到合适的谷歌关键词.有没有人手头有链接?
我试图循环形式检查空字段然后执行和功能.我现在正在使用下面这个我在这个网站上找到的东西,但是发生了什么,每个循环检查1字段,并看到1不是空的,仍然执行其他功能.我想我需要立即检查所有然后执行下一个功能.我怎么能实现这个目标?
if($('.enter-info--ownerInfo .req').val() != "") {
alert("Empty Fields!!")
} else {
run this function
}
Run Code Online (Sandbox Code Playgroud)
谢谢...
有人指出在javascript中添加空数组有趣,我不知道为什么它的工作方式如此.
添加空数组会产生一个字符串.
换句话说,[] + []回报""
我启动了我的控制台来测试它,果然,它确实有效.我进一步发现这种行为不仅限于空数组.数字,字符串,数组和对象的数组在添加到任何其他数组时都会变成字符串.一些例子是:
[1] + [] //returns "1"
[1] + [2] //returns "12"
[1,2,3] + [2] //returns "1,2,32"
[{foo:'bar'},'foo','bar'] + [] //returns "[object Object],foo,bar"
Run Code Online (Sandbox Code Playgroud)
当添加到其他任何对象时,它也会与其他对象一起出现,但仅当对象位于右侧时才会出现.如果它在左侧,则对象变为0.
'foo' + {foo:'bar'} //returns "foo[object Object]"
1 + {foo:'bar'} //returns "1[object Object]"
{foo:'bar'} + 1 //returns 1
{foo:'bar'} + 'foo' //returns NaN
Run Code Online (Sandbox Code Playgroud)
除非我将对象分配给变量,否则会发生这种情况.如果我用X = {foo:'bar'},
X + 'foo' //returns "[object Object]foo"
Run Code Online (Sandbox Code Playgroud)
然后对象又变成了一个字符串.
我可以理解为什么这种类型的转换可能会在==运算符中发生,但为什么要添加呢?为什么添加更改数组和对象(是的,我知道数组也是对象)到其他东西?