!+ [1, ]这个是我最近看到的一个奇怪的javascript表达式(其实我也不知道如何称呼他),出自这篇文章http://www.cnblogs.com/smallsong/archive/2012/02/20/2358884.html。
我记得我以前看过,貌似有些黑客用这些奇怪的表达式构造了许多奇怪的功能。不过我现在实在想不起来了,然后Google和百度也搜不到想要的。于是就到这里问问了。
这个真的很有趣啊
人生最曼妙的风景,竟是内心的淡定与从容!
这个不算奇怪。只是涉及到 JavaScript 内部运算时变量类型隐式转换的问题。
[1,] // [1]
在执行的时候,等同于 [1]。
+[1,]
相当于做了一次隐式转换 Number([1,].toString())。转换的结果就是 1
Number([1,].toString())
1
!+[1,]
就是对 1 取反。最后结果就是 false 了。
false
说个好玩的吧。比如不用数字和字母写代码也是可以的。
+[] // 0 ++[+[]][+[]] // 1 // ... 以此类推,字母和数字都可以表示出来了
好吧这段代码的功能还可以区分IE6到8和其他浏览器。
if ( !+ [1, ] ){ alert("yes!") ; } else { alert("no!") ; }
IE6~8:yes!
ie9+:no!
第一次看到这方面的是这个表达式
++[[]][+[]]+[+[]]
js中+[]==0,+[1]==1
lz引用那个作者纯粹蛋疼...(捂脸
=.=我表示忘记兼容了=.=我上面说的那句是错的,表示道歉
这是用来判断ie的,因为数组中最后一个是逗号,ie会出错,而标准浏览器正常。 一般这样的写法比较多 !-[1,]
!-[1,]
({}+[])
"[object Object]"
!![]+[]
"true"
![]+[]
"false"
{}+{}+[]
"NaN"
[][[]]+[]
"undefined"
+[]
0
![]+!![]
利用这些可以构造出神奇的东西
({}+[])[!![]-~!![]-~!![]]+(!![]+[])[-~!![]]+([][[]]+[])[!![]-~!![]-~!![]]+(!![]+[])[+[]]
IE6,7,8下这个地方是一个bug, 如 @HJin.me 所说:+[1,]加号相当于做了一次向字符串的隐式转换,但是Number([1,].toString())的结果在IE6,7,8下并不是1而是NAN, NaN是为数不多的可以等同false的对象,取反后为true.
NAN
NaN
true
所以这段代码经常用来区分浏览器是否是IE6,7,8.
而这个bug出现后IE一直没有针对这些情况做升级和改进.这也是为什么IE9以前的系列被前端开发人员称为噩梦的众多原因.
这个不算奇怪。只是涉及到 JavaScript 内部运算时变量类型隐式转换的问题。
在执行的时候,等同于 [1]。
相当于做了一次隐式转换
Number([1,].toString())
。转换的结果就是1
就是对
1
取反。最后结果就是false
了。说个好玩的吧。比如不用数字和字母写代码也是可以的。
好吧这段代码的功能还可以区分IE6到8和其他浏览器。
IE6~8:yes!
ie9+:no!
第一次看到这方面的是这个表达式
js中+[]==0,+[1]==1
lz引用那个作者纯粹蛋疼...(捂脸=.=我表示忘记兼容了=.=我上面说的那句是错的,表示道歉
这是用来判断ie的,因为数组中最后一个是逗号,ie会出错,而标准浏览器正常。 一般这样的写法比较多
!-[1,]
({}+[])
!![]+[]
![]+[]
{}+{}+[]
[][[]]+[]
+[]
![]+!![]
利用这些可以构造出神奇的东西
IE6,7,8下这个地方是一个bug, 如 @HJin.me 所说:
+[1,]
加号相当于做了一次向字符串的隐式转换,但是Number([1,].toString())
的结果在IE6,7,8下并不是1
而是NAN
,NaN
是为数不多的可以等同false
的对象,取反后为true
.所以这段代码经常用来区分浏览器是否是IE6,7,8.
而这个bug出现后IE一直没有针对这些情况做升级和改进.这也是为什么IE9以前的系列被前端开发人员称为噩梦的众多原因.