RegExp эквивалент массива .indexOf (str) - PullRequest
0 голосов
/ 27 ноября 2011

Учитывая переменную str, содержащую строковое значение, эквивалентны ли эти две строки кода?

Строка A:

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

Строка B:

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

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Не совсем. Трубы включают ^ и $ в качестве альтернативы. Я не совсем понимаю синтаксис регулярных выражений JS, но если вы ищете, чтобы str содержал только foo, или bar, или baz, используйте выражение /^(foo|bar|baz)$/. Если вы хотите сделать что-то другое, дайте мне знать, и я постараюсь прояснить это.

1 голос
/ 27 ноября 2011

Нет, это не так.

Метод indexOf() возвращает -1, если элемент не найден в массиве, или позиция массива, если он равен , найден в массиве.

Метод test возвращает true, если регулярное выражение находит совпадение, и false, если нет.

Если бы вместо этого было регулярное выражение /^(foo|bar|baz)$/, функция была бы такой же.

1 голос
/ 27 ноября 2011

Хорошо, после редактирования они все еще не эквивалентны, так как 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.

...