'replace'字符串方法如何与以脱字符号(正则表达式)和字符串函数作为参数一起使用?

时间:2019-01-10 21:32:17

标签: javascript regex

我正在查看一些有意混淆的代码以进行在线挑战。我正在寻找一条线的说明。我知道这将返回true,就像!''将返回true。但是似乎其余的代码将永远不会做任何事情。我认为这只是使问题看起来更令人困惑。我希望对发生的事情有一些深入的技术细节。

我知道代码当前返回的内容,但是我对它在更深层次的工作方式感到好奇。我查找了'replace'字符串方法,并且了解了如何使用正则表达式和在每个匹配项上运行的函数。我还查看了String函数,并了解它只是将事物强制转换为字符串。我知道正则表达式插入符号匹配行的开头。

// note: typeof String === "function"
!''.replace(/^/, String)

3 个答案:

答案 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。