Javascript 与array.indexOf(str)等价的RegExp

Javascript 与array.indexOf(str)等价的RegExp,javascript,regex,theory,Javascript,Regex,Theory,给定一个包含字符串值的变量str,这两行代码是否等效 A行: if ( [ 'foo', 'bar', 'baz' ].indexOf( str ) > -1 ) { B行: if ( /^foo|bar|baz$/.test( str ) ) { 好的,在编辑之后,它们仍然不是等价的,因为test将调用toString。见: var myItem = {toString: function() { return 'foo'; }}; ['foo', 'bar', 'baz'].in

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

A行:

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

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

好的,在编辑之后,它们仍然不是等价的,因为
test
将调用
toString
。见:

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

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

即使它们是字符串值(抱歉,遗漏了这一点),它们仍然是不等价的,因为有两种不同类型的字符串,
indexOf
使用严格的相等/标识:


为了使它们真正等效,您可以在使用
indexOf
之前调用
.toString()
,或者可以在使用
test
之前测试
Object.prototype.toString.call(myItem)=='[Object String]'
好的,在编辑之后,由于
test
将调用
toString
,因此它们仍然是不等价的。见:

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

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

即使它们是字符串值(抱歉,遗漏了这一点),它们仍然是不等价的,因为有两种不同类型的字符串,
indexOf
使用严格的相等/标识:


为了使它们真正等效,您可以在使用
indexOf
之前调用
.toString()
,或者在使用
测试
之前测试
对象.prototype.toString.call(myItem)=='[Object String]'
。管道包括
^
$
作为备选方案。我不完全清楚JS正则表达式的语法,但如果您希望
str
只包含
foo
,或
bar
,或
baz
,请使用表达式
/^(foo | bar | baz)$/
。如果您想做一些不同的事情,请告诉我,我会尽力澄清。

不太清楚。管道包括
^
$
作为备选方案。我不完全清楚JS正则表达式的语法,但如果您希望
str
只包含
foo
,或
bar
,或
baz
,请使用表达式
/^(foo | bar | baz)$/
。如果您想做一些不同的事情,请告诉我,我会尽力澄清。

不,他们不是

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

如果正则表达式找到匹配项,则该方法返回
true
,如果未找到匹配项,则返回
false

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

不,它们不是

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

如果正则表达式找到匹配项,则该方法返回
true
,如果未找到匹配项,则返回
false



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

可能的重复不是完全重复。他想把indexOf转换成正则表达式,这个问题想在正则表达式上调用indexOf。可能的重复不是完全重复。他想把indexOf转换成正则表达式,这个问题想在正则表达式上调用indexOf。我想实现a行和B行的行为。(所以,是的,我想检查
str
是否正好是这3个值中的一个…)然后是的,你想要我给你的正则表达式。或者,如果不需要捕获匹配的/哪个/值,可以使用
/^(?:foo | bar | baz)$/
?:
的意思是“不要费心记住这三个匹配项中的哪一个”,可能会快一点。你能解释一下为什么我必须将
a | b | c
分组吗?这有什么区别呢?我想实现a行和B行的行为(所以,是的,我想检查
str
是否正好是这3个值中的一个…),然后是的,你想要我给你的正则表达式。或者,如果不需要捕获匹配的/哪个/值,可以使用
/^(?:foo | bar | baz)$/
?:
的意思是“不要费心记住这三个匹配项中的哪一个”,可能会快一点。你能解释一下为什么我必须将
a | b | c
分组吗?这有什么不同?他们还是不同的。Minitech给了你一些B会捕获a不会捕获的东西的例子,并查看了我给你的正则表达式以了解如何修复它。@Minitech是的,但我在问题中提到,
str
是一个字符串值。。。它不可能是一个对象。@ŠimeVidas:对不起,错过了。我再次编辑了我的答案-它们是。@minitech呃<代码>:)
当我说“字符串值”时,我指的是字符串类型的值,而不是字符串对象。。。(字符串对象是无用的,我永远不会使用它们…@ŠimeVidas:我知道:)但是你的问题被标记了,这是可能的。jQuery也这么做,但它们还是不同的。Minitech给了你一些B会捕获a不会捕获的东西的例子,并查看了我给你的正则表达式以了解如何修复它。@Minitech是的,但我在问题中提到,
str
是一个字符串值。。。它不可能是一个对象。@ŠimeVidas:对不起,错过了。我再次编辑了我的答案-它们是。@minitech呃<代码>:)
当我说“字符串值”时,我指的是字符串类型的值,而不是字符串对象。。。(字符串对象是无用的,我永远不会使用它们…@ŠimeVidas:我知道:)但是你的问题被标记了,这是可能的。jQuery也这样做。但是为什么需要paren?因为
/^foo | bar$/
^foo
bar$
,因此会匹配“傻瓜”,也会匹配“沙洲”。但是为什么需要paren?因为
/^foo | bar$/
^foo
bar$
,因此会匹配“傻瓜”,而且也会匹配“沙洲”。