我正在查看一些有意混淆的代码以进行在线挑战。我正在寻找一条线的说明。我知道这将返回true,就像!''将返回true。但是似乎其余的代码将永远不会做任何事情。我认为这只是使问题看起来更令人困惑。我希望对发生的事情有一些深入的技术细节。
我知道代码当前返回的内容,但是我对它在更深层次的工作方式感到好奇。我查找了'replace'字符串方法,并且了解了如何使用正则表达式和在每个匹配项上运行的函数。我还查看了String函数,并了解它只是将事物强制转换为字符串。我知道正则表达式插入符号匹配行的开头。
// note: typeof String === "function"
!''.replace(/^/, String)
答案 0 :(得分:2)
您想得太深了,''.replace(/^/, String)
确实没有''
所做的任何事情。
答案 1 :(得分:2)
解释它在做什么的最好方法是首先使其变得稍微复杂一些。
首先要注意的是,String.prototype.replace()
方法在使用回调函数进行调用时将先传递Private Sub UserForm_Initialize()
comboBox1.List = Array("A", "B", "C", "D")
comboBox2.List = Array("1", "2", "3", "4")
End Sub
Private Sub CommandButton1_Click()
Call runCommand
Unload Me
End Sub
Sub runCommand()
Dim Ret_Val
Dim Arg1 As String
Dim Arg2 As String
Dim command As String
Arg1 = comboBox1.Value
Arg2 = comboBox2.value
command = "C:\Program Files\PuTTY\plink.exe" & " -v" & " " & "user@host" & " -pw" & " " & "testpw" & " " & "echo &Arg1,&Arg2"
Ret_Val = Shell(command & ">C:\logs\log.txt", 1)
If Ret_Val = 0 Then
MsgBox "Error!", vbOKOnly
End If
End Sub
,然后传递所有捕获的组(在这种情况下,没有传递),然后传递{{1} },然后以match
作为参数,因此它可以扩展为:
offset
现在,当将String()
作为静态方法(没有new
运算符)调用时,它将获取其第一个参数并将其转换为字符串,而忽略传递的其余参数:>
string
鉴于此,我们现在可以将表达式简化为:
!''.replace(/^/, (match, offset, string) => String(match, offset, string))
因为console.log(String('foo', 0, 'foo bar')) // 0, 'foo bar' ignored
已经是一个字符串。现在!''.replace(/^/, match => match)
与调用该方法的字符串开头的零宽度部分匹配,并且match
将回调函数的返回值插入到同一位置。由于/^/
是的返回值,因此整个replace()
不会产生任何副作用,因此表达式现在等效于:
match
而且,正如您已经指出的,.replace(/^/, match => match)
是虚假的,因此!''
的值为''
。
答案 2 :(得分:-1)
'hello'.replace(/^/, 'world'); // 'worldhello'
'hello'.replace(/e/, String); // 'hello'
'hello'.replace(/^/, String); // 'hello'
''.replace(/^/, String); // ''
!''.replace(/^/, String); // true
替换为String
不会执行任何操作。
否定''
将''
转换为布尔值(即false)并将其取反。
瞧瞧,!''.replace(/^/, String)
的计算结果为true。