- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看一些有意混淆的在线挑战代码。我正在寻找一条线的说明。我知道这将返回 true,就像 !'' 将返回 true 一样。但似乎其余代码永远不会做任何事情。我认为这只是为了让问题看起来更困惑。我将不胜感激有关正在发生的事情的一些深入的技术细节。
我知道代码当前返回的是什么,但我很好奇它在更深层次上是如何工作的。我查找了“替换”字符串方法,并且我了解它如何采用正则表达式和对每个匹配项进行操作的函数。我还查找了 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)
因为 match
已经是一个字符串。现在 /^/
匹配调用该方法的字符串开头的零宽度部分,并且 replace()
将回调函数的返回值插入到相同的位置。由于 match
是 返回值,整个 .replace(/^/, match => match)
不会产生副作用,所以该表达式现在等效于:
!''
而且,正如您已经指出的那样,''
是假的,因此 !''
的计算结果为 true
。
关于javascript - 'replace' 字符串方法如何使用插入符作为正则表达式和字符串函数作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137216/
我是一名优秀的程序员,十分优秀!