inherit.js 中的奇怪正则表达式(由 John Resig 撰写) - 为啥,啥以及如何? [复制]

Posted

技术标签:

【中文标题】inherit.js 中的奇怪正则表达式(由 John Resig 撰写) - 为啥,啥以及如何? [复制]【英文标题】:Weird regex in inherit.js (by John Resig) - why, what and how? [duplicate]inherit.js 中的奇怪正则表达式(由 John Resig 撰写) - 为什么,什么以及如何? [复制] 【发布时间】:2013-06-18 04:28:06 【问题描述】:

我最近使用了 John Resig 的 little utility library,名为 inherit.js。我通常尝试了解我正在使用的库的核心部分,经过一番摸索,我终于明白了代码的难点(即他如何调用超类的相应方法)。

我没有得到的 1% 位与正则表达式有关

fnTest = /xyz/.test(function()xyz;) ? /\b_super\b/ : /.*/;
    正则表达式 /xyz/ 已针对 函数 进行测试。 MSDN 和 MDN 都声明 test 将字符串作为参数。没有提到一个功能,但由于控制台没有错误,我猜它必须飞,但它是如何工作的? 下一个 WTF 是函数体是xyz;。此函数无法执行,否则会导致“ReferenceError: xyz is not defined”。正确的?那么它有什么作用呢? 如果测试结果为真,则fnTest 等于在单词边界上检查_super 的正则表达式,否则是匹配任何内容的正则表达式。双WTF;再次如何以及为什么。

稍后有一段相关的代码,正在使用这个正则表达式。

  // Check if we're overwriting an existing function
  prototype[name] = typeof prop[name] == "function" &&
    typeof _super[name] == "function" && fnTest.test(prop[name])
        ? aFunctionThatCanCallSuper /* Lots of code */
        : prop[name];

我想知道的一点是fnTest.test(prop[name])。我了解所有其他测试,检查属性是否存在、是否是函数等,但不了解正则表达式测试的作用。有人吗?

【问题讨论】:

Understanding John Resig's 'Simple javascript Inheritance' @Andreas:哇,希望我早点发现,只是不得不破译这个东西,但似乎我的发现是正确的。 甚至不值得发布我的答案,该链接似乎是完美的答案。我猜如果您今天要重做这个库,鉴于现代浏览器将正确序列化,因此不需要检查。 很好的链接!但是对于免费积分,您可以发布相关积分的快速总结(或者我会在几天内发布):) 因为我只复制了一个链接,让@elclanrs 再写一次他的答案并奖励他的努力:) 【参考方案1】:

什么

test 只接受字符串作为输入,因此函数将是toStringed,就像任何其他不是字符串的对象一样。 xyz 不被解释为一个变量,而是一个字符串,所以它不会抛出一个引用错误。这也发生在其他地方,例如:

var a = function(); var b = function();
console.log(a + b); // `+` coerces with `toString`

为什么

旧浏览器中函数的序列化不可靠,可能不会在函数体中输出_super 属性,但(我假设)类似于function[native code][object Object];在这些情况下,使用诸如/.*/ 之类的正则表达式来匹配任何内容,而不执行可以在输出正确结果的浏览器中进行的优化。

更多信息的相关链接:

http://blog.buymeasoda.com/understanding-john-resigs-simple-javascript-i/(安德烈亚斯发现)http://es5.github.io/x15.3.html#x15.3.4.2http://bytes.com/topic/javascript/answers/747203-function-tostring

【讨论】:

以上是关于inherit.js 中的奇怪正则表达式(由 John Resig 撰写) - 为啥,啥以及如何? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

传递项目 ID 时 cloudbuild.yaml 文件中的正则表达式错误

Perl - 正则表达式匹配的输出非常奇怪,确实

正则表达式的一点奇怪

shell脚本奇怪的正则表达式

在 Javascript 中使用正则表达式容纳多个值

使用正则表达式 python 由 `|` 分隔的标签中的错误