我得到了一些混淆的JavaScript代码。我试图理解它,为此我在控制台中输入了一些代码片段。但是我无法理解其中的原因。
> ((!!+[]+"")[+!![]])
< "a"
为什么在JavaScript中
((!!+[]+"")[+!![]])
等于"a"
呢?有其他代码片段可以获得其他字母吗?我猜这与自动类型转换有关。
我得到了一些混淆的JavaScript代码。我试图理解它,为此我在控制台中输入了一些代码片段。但是我无法理解其中的原因。
> ((!!+[]+"")[+!![]])
< "a"
((!!+[]+"")[+!![]])
等于"a"
呢?有其他代码片段可以获得其他字母吗?( ( !!+[] + "" ) [ +!![] ] )
( ( !!0 + "" ) [ +true ] )
( ( false + "" ) [ +true ] )
( ( "false" ) [ 1 ] )
( "false"[1] )
( "a" )
+[]
的值为0?会不会是将空数组转换成了数字,那么为什么不是0呢?这应该只是个小问题,如果可能的话最好能有更好的解释。 - Hugues M.+
将 []
解析为数字类型。 - pomber[] + ""
在控制台中输出""
。仅输入(!!+[])
返回布尔值false
。如果将布尔值false
附加到""
上,则由于类型转换,将得到字符串false
。如预期地,键入(!!+[]+"")
在控制台中输出"false"
。((!!+[]+"")[+!![]])
中,您可以去掉最外层括号,使它看起来更简单。现在我们有(!!+[]+"")[+!![]]
,其中括号中的第一部分返回字符串"false"
,而括号中的下一个部分[]
则访问了字符串"false"
的字符。现在您可以确定+!![]
某种程度上返回1,因为"false"[1]
等于"a"
。+!![]
如何等于1
:
[]
是一个空数组,您可以将其视为0
,在JavaScript中这将是true
(因为“在JavaScript中任何“真实”的东西都是true
”),因此![]
为false
,!![]
为true
。+true
,这只是将true
转换为数字的简写,其结果是1
。现在您可以看到+!![]
如何计算出1
,并且您了解(希望如此)这个混淆的代码如何工作!!!+[] // 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"
x
的类型是什么,+x
始终计算为数字。对于!x
也是如此。因此,对于您的表达式:// A: !!+[]+"" which is evaluated like !(!(+[]))+""
+[] === 0
!0 === true
!true === false
false+'' === 'false'
// B: +!![] which is evaluated like +(!(![]))
![] === false
!false === true
+true === 1
我们得到了A[B]
,它只是'false'[1] === 'a'
。
您可以在MDN上了解有关隐式类型转换和运算符优先级的更多信息。
隐式类型转换是有经验的JavaScript程序员在比较值时更喜欢使用===
而不是==
的原因。
以下是详细的逐步过程:
( !! +[] + "" ) [ +!![] ]
// ^^^
+[]
对数组字面量进行一元加操作,相当于 Number([])
,结果为 0
。
点击此处 查看为什么会得出 0
的解释。
( !! 0 + "" ) [ +!![] ]
//^^^^
!!0
等同于!!Boolean(0))
,它的值为false
,因为0
是假值。
( false + "" ) [ +!![] ]
//^^^^^^^^^^^
false+""
是简单的字符串拼接,因此计算结果为 "false"
。"false" [ +!![] ]
// ^^^^
!![]
等同于 !!Boolean([])
,由于对象的布尔转换始终为真,因此这将评估为true
。
"false" [ +true ]
// ^^^^^
+true
等同于 Number(true)
,它的值为 1
。
"false" [ 1 ]
这里的关键点是Javascript在评估表达式时进行隐式类型转换或类型强制转换。要了解更多关于类型强制转换的信息,我建议阅读Axel Rauschmayer博士撰写的这个优秀资源。
最终结果是a
。
(“false” [1])
。现在你知道为什么结果是a
了。 - abhishekkannojia(!!+[]+"")
等于"false"
,而+!![]
等于1
? - Toan Tran