'replace'字符串方法如何使用插入符号作为正则表达式和字符串函数作为参数?



我正在为在线挑战寻找一些故意混淆的代码。我正在为一行寻求澄清。我知道这会成真的,就像将返回true。但代码的其余部分似乎永远不会做任何事情。我想这只是为了让问题看起来更令人困惑。我将感谢一些深入的技术细节正在发生的事情。

我知道代码目前返回的是什么,但我很好奇这在更深层次上是如何工作的。我查找了"replace"字符串方法,了解了它如何使用正则表达式和对每个匹配进行操作的函数。我还查阅了String函数,了解到它只是将事物转换为字符串。我知道正则表达式插入符号匹配行首。

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

解释它正在做什么的最好方法是先让它稍微复杂一点。

首先要注意的是,当使用回调函数调用String.prototype.replace()方法时,它将传递match,然后传递任何捕获的组(在本例中为无),然后传递offset,然后再传递string作为参数,因此它可以扩展为:

!''.replace(/^/, (match, offset, string) => String(match, offset, string))

现在,当String()作为静态方法调用时(没有new运算符),它会获取第一个参数并将其转换为字符串,忽略传递的其余参数:

console.log(String('foo', 0, 'foo bar')) // 0, 'foo bar' ignored

鉴于此,我们现在可以将表达式简化为:

!''.replace(/^/, match => match)

因为CCD_ 7已经是字符串。现在,/^/与调用该方法的字符串开头的零宽度部分匹配,replace()将回调函数的返回值插入到同一位置。由于match返回值,因此整个.replace(/^/, match => match)不会产生副作用,因此该表达式现在等效于:

!''

而且,正如您已经指出的,''是错误的,所以!''的求值为true

你想得太多了,''.replace(/^/, String)确实没有做''没有做的任何事情。

'hello'.replace(/^/, 'world'); // 'worldhello'
'hello'.replace(/e/, String); // 'hello'
'hello'.replace(/^/, String); // 'hello'
''.replace(/^/, String); // ''
!''.replace(/^/, String); // true

替换为String没有任何作用。

求反''''转换为布尔值(即false)并求反。

瞧,你知道了,!''.replace(/^/, String)评估为真。

最新更新