我拿到了一些模糊的JavaScript代码。我试着去理解它,并这样做,我在控制台中输入了其中的一些片段。我不明白为什么
> ((!!+[]+"")[+!![]])
< "a"为什么((!!+[]+"")[+!![]])在JavaScript中等于"a"?还有其他的代码片段来获取其他字母吗?
我想这跟自动铸造有关。
发布于 2017-05-28 15:40:07
( ( !!+[] + "" ) [ +!![] ] )
( ( !!0 + "" ) [ +true ] )
( ( false + "" ) [ +true ] )
( ( "false" ) [ 1 ] )
( "false"[1] )
( "a" ) 还有其他的代码片段来获取其他字母吗?
您可以使用相同的概念来获取“真”、“假”、“未定义”、“NaN”中的所有字母.
发布于 2017-05-28 15:40:34
您应该在JavaScript中处理操作符优先级和类型铸件:
!!+[] // Is falsey. this is same for !!+0 or !!+""
false + "" // Is "false". as 5+"" is "5".
![] // Is falsey.
!false // Is true
+true // Is equal to 1. +[] = 0, +false = 0至少,
"false"[1] // Is "a"发布于 2017-05-28 15:42:57
如果我们不知道这意味着什么,让我们使用控制台获得答案,输入
控制台中的[] + ""输出""
只需放置(!!+[])就可以返回布尔值false。如果将布尔型false附加到""中,则会得到由于类型强制而产生的字符串false。
正如预期的那样,键入(!!+[]+"")将"false"输出到控制台。
接下来,在JavaScript中,您可以将字符串看作字符数组,并且可以使用数组表示法访问它们的字符。
因此,在((!!+[]+"")[+!![]])中,您可以删除最外层的括号,使其看起来更简单。现在我们有了(!!+[]+"")[+!![]],()中的第一部分返回字符串"false",而[]中的下一部分则访问字符串"false"的一个字符。您现在可以打赌,+!![]以某种方式返回1,因为"false"[1]等于"a"。
现在让我们看看+!![]如何等于1
[]是一个空数组,您可以认为它是0,它在JavaScript中是true (因为“在JavaScript中,任何‘真实的’都是true__"),所以false和!![]是true。
现在留给我们的是+true,它仅仅是将true转换成一个数字的缩写,这个数字就是1。现在,您可以看到+!![]是如何计算为1的,并且您理解(希望)这段模糊的代码是如何工作的!
https://stackoverflow.com/questions/44229023
复制相似问题