inherit.js中的奇怪正则表达式(由John Resig撰写) - 为什么,什么以及如何?

时间:2013-06-21 05:49:20

标签: javascript regex prototype resig

我最近使用了John Resig的little utility library,名为inherit.js。我经常尝试理解我正在使用的库的核心部分,经过大量的讨论后我终于理解了代码的硬件(即他如何调用超类的相应方法)。

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

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
  1. 针对函数测试regex / xyz /。 MSDNMDN都声明test将字符串作为参数。没有提到功能,但由于控制台没有错误,我想它必须飞,但它是如何工作的?
  2. 下一个WTF是函数体xyz;。此功能无法执行,否则会导致“ReferenceError: xyz is not defined”。对?那它做了什么?
  3. 如果测试结果为真,则fnTest等于在字边界检查_super的正则表达式,否则匹配任何内容的正则表达式。双WTF;又如何以及为什么。
  4. 后来有一段相关的代码,正在使用这个正则表达式。

      // 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])。我理解所有其他测试,检查属性是否存在,是一个函数等,但不是正则表达式测试的作用。任何人吗?

1 个答案:

答案 0 :(得分:6)

what

test只接受字符串作为输入,因此函数将被toString编辑,就像任何其他不是字符串的对象一样。 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.2
http://bytes.com/topic/javascript/answers/747203-function-tostring