Javascript正则表达式测试行为与功能

时间:2013-11-05 00:37:20

标签: javascript regex

有人能解释一下这种行为吗?我不明白......变量a没有触及。哪里有用?

a === undefined // not touched -> on call variable a got exception (this behavior I understand)
/a/.test(function(){a}) // => true !!?

由于

修改

非常感谢您的回答,但我目前只有一个子问题。

http://ejohn.org/blog/simple-javascript-inheritance/#ig-sh-2

关于这段代码:

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/

为什么约翰使用这个?而不是简单的

fnTest = /\b_super\b/ 

如果我理解,/xyz/.test(function(){xyz;})每次都是正确的,就像

一样
/xyz/.test('function(){xyz;}')

3 个答案:

答案 0 :(得分:2)

你在哪里:

a === undefined // not touched -> on call variable a got exception

这是测试 a 的值是否未定义。如果a已声明且未分配值(在此情况下评估其值将返回 undefined ),或者已为其指定值 undefined ,则返回true 。如果 a 尚未声明或以其他方式初始化,则会引发参考错误。

在所有其他情况下,它将返回 false

在:

/a/.test(function(){a}) // => true !!?

表达式/a/是一个正则表达式初始化程序(或literal),它创建一个新的正则表达式,如下所示:

new RegExp('a');

匹配字符串中任何位置的“a”字符。

然后调用正则表达式的test方法,该方法将返回true或false。 test 的参数是一个字符串,所以如果不是,则将其转换为字符串。这将返回一个表示函数的字符串(实际上是函数的实际代码)。所以你有效地拥有:

var re = new RegExp('a');
var s = 'function(){a}';
re.test(s);

将返回true(因为字符串中有“a”)。

修改

你似乎在问这个问题:

var initializing = false,
          fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

正在做的是根据使用正则表达式 test 方法测试函数对象的结果,为函数对象创建测试。

测试方法的参数应该是一个字符串,因此根据ECMA-262,如果不是,则将其转换为字符串。如果参数是一个对象,那么将调用它的 toString 方法,并且对于通常的函数返回函数体中的代码,但并非总是而不是全部ECMAScript主机。

例如,内置函数很多都会返回:

function pow() {
  [native code]
}

所以上面所说的是“如果函数返回函数体,则将以下内容分配给 fnTest :”

new RegExp('\\b_super\\b');

(请注意,这种形式的正则表达式需要双反斜杠),它将匹配一个字符串,其中包含单词“_super”。

如果函数没有返回函数体,它会将 fnTest 设置为:

new RegExp('.*');

将匹配任何包含零个或多个字符的字符串。

答案 1 :(得分:1)

如果您尝试访问未定义的变量(不是对象的属性),您将获得ReferenceError

要避免这种情况,请定义您的变量:

var a;

a === undefined; //true

现在第二个例子:

/a/是正则表达式文字,与new RegExp('a');相同,因此它与a变量无关。

至于最后一部分.test(function(){a}),该函数尚未执行,因此未访问a变量(未定义),因此没有错误。

此外,它返回true因为test函数需要一个字符串而不是一个函数,所以它会将函数隐式转换为它的字符串值。

因此,就像你在做:/a/.test('function () {a}');

答案 2 :(得分:0)

这些行为的原因是:

  • a === undefined,它显示变量得到异常,因为a显然没有定义。

  • /a/.test(funcion(){a})它返回true,因为/a/创建正则表达式变量

  • test内,function(){a}创建一个函数,但尚未调用,因此不会出现异常。

但我没有得到返回true的理由。 = =