我正在为在线挑战寻找一些故意混淆的代码。我正在为一行寻求澄清。我知道这会成真的,就像将返回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)
评估为真。