javascript - inherit.js 中的奇怪正则表达式(John Resig 着)——为什么、什么以及如何?

标签 javascript regex prototype resig

<分区>

我最近使用了一个 little utility library作者:John Resig,称为 inherit.js .我通常试图理解我正在使用的库的核心部分,经过一番摸索之后我终于理解了代码的难点(即他如何调用父类(super class)的相应方法)。

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

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
  1. 正则表达式/xyz/针对函数 进行了测试。两者 MSDNMDN声明 test 将字符串作为参数。没有提到功能,但由于控制台没有错误,我想它一定会飞,但它是如何工作的?
  2. 下一个 WTF 是函数体是 xyz;。该函数无法执行,否则会导致“ReferenceError: xyz is not defined”。正确的?那么它有什么作用呢?
  3. 如果测试结果为真,则 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])。我了解所有其他测试,这些测试检查属性是否存在,是一个函数等,但不了解正则表达式测试的作用。有人吗?

最佳答案

什么:

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

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

原因:

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

更多信息的相关链接:

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

关于javascript - inherit.js 中的奇怪正则表达式(John Resig 着)——为什么、什么以及如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17228486/

相关文章:

javascript - 如何使用旧版免费 JavaScript 将标记(不仅仅是纯文本)复制到剪贴板

javascript - 如何在angularjs中悬停显示文本?

regex - 正则表达式中 * 和 .* 的区别

javascript - 如何从 JavaScript 的公共(public)方法中访问私有(private)属性?

javascript - 具有自己的集合名称的 JS 原型(prototype)函数扩展

javascript - js如何原型(prototype)化表单元素?

javascript - 闪存 slider 还是什么?

javascript - 如何使用正则表达式和 jQuery 将两个单独的字符串替换为两个单独的替换字符串?

Javascript 正则表达式 [删除事件]

javascript:计算文本输入中的数字