给定包含字符串值的变量str
,这两行代码是否等效?
A行:
if ( [ 'foo', 'bar', 'baz' ].indexOf( str ) > -1 ) {
B行:
if ( /^foo|bar|baz$/.test( str ) ) {
答案 0 :(得分:2)
不完全。管道包括^
和$
作为替代品。我并不完全清楚JS正则表达式的语法,但是如果你想要str
只包含foo
,bar
或baz
,请使用表达式/^(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
即使它们是字符串值(抱歉,错过了),那么它们仍然不等同,因为有两种不同类型的字符串,indexOf
使用严格的相等/标识:
要使它们真正等效,您可以在使用.toString()
之前致电indexOf
,也可以在使用Object.prototype.toString.call(myItem) === '[object String]'
之前测试test
。
答案 2 :(得分:1)