RegExp等价于array.indexOf(str)

时间:2011-11-27 03:03:46

标签: javascript regex theory

给定包含字符串值的变量str,这两行代码是否等效?

A行:

if ( [ 'foo', 'bar', 'baz' ].indexOf( str ) > -1 ) {

B行:

if ( /^foo|bar|baz$/.test( str ) ) {

3 个答案:

答案 0 :(得分:2)

不完全。管道包括^$作为替代品。我并不完全清楚JS正则表达式的语法,但是如果你想要str只包含foobarbaz,请使用表达式/^(foo|bar|baz)$/。如果你想做一些不同的事情,请告诉我,我会尽力清理它。

答案 1 :(得分:1)

好的,在编辑之后,由于test会调用toString,因此它们仍然不相同。参见:

var myItem = {toString: function() { return 'foo'; }};

['foo', 'bar', 'baz'].indexOf(myItem); // -1
/^(foo|bar|baz)$/.test(myItem); // true

http://jsfiddle.net/hqu7D/

即使它们是字符串值(抱歉,错过了),那么它们仍然不等同,因为有两种不同类型的字符串,indexOf使用严格的相等/标识:

http://jsfiddle.net/HpCUY/

要使它们真正等效,您可以在使用.toString()之前致电indexOf,也可以在使用Object.prototype.toString.call(myItem) === '[object String]'之前测试test

答案 2 :(得分:1)

不,他们不是。

如果在数组中找不到该项,则indexOf()方法返回-1,如果在数组中找到 ,则返回数组的位置。

如果正则表达式找到匹配项,则test方法会返回true,如果不匹配则返回false

如果您的正则表达式是/^(foo|bar|baz)$/,那么函数将是相同的。