Comments 28
Вариация по теме:
var numbers = [3, 5, 8, 11, 23, 7];
if ( ~numbers.indexOf(1) ) {
// ...
}
За что минусуют? Вполне читаемый вариант. Главное, чтобы в проекте везде использовался один способ.
За то, что это использование оператора не по назначению. Ничем не лучше
if (numbers.indexOf(x) + 1) {
//...
}
Кстати, тоже неплохо (имхо).
Писать что угодно, лишь бы не очевидный numbers.indexOf(x) > -1
? Такая логика что ли?
Я о том, что он тоже вполне читаемый, хоть и выглядит странно и непривычно.
Вариант же с ~ мне нравится тем, что он короткий. Если это принято на уровне всего проекта, на уровне кодстайла, и при этом есть оговорка, что ~ используется только с indexOf без вложенности, и не используется в более сложных конструкциях (
Вариант же с ~ мне нравится тем, что он короткий. Если это принято на уровне всего проекта, на уровне кодстайла, и при этом есть оговорка, что ~ используется только с indexOf без вложенности, и не используется в более сложных конструкциях (
~arr.indexOf(x)
можно, а ~(тут_какое-то_очень_сложное_условие_которое_может_вернуть_-1)
— нельзя), то это не должно привести к ухудшению читаемости.Не стоит так писать, если это будет кто-то читать.
> так как в общем-то indexOf и includes по логике должны иметь одну и ту же вычислительную сложность.
Сложность у них разная будет, как ни крути. Вы же сами выше писали, что indexOf не правильно работает с NaN.
Для исправления этого огреха с NaN необходимо проверять каждый элемент массива на isNaN, при этом нужно будет проверить еще и тип элемента, т.к. isNaN('a') == true.
В то время когда Array.indexOf будет сравнивать по ссылке, а в некоторых случаях еще и по значению.
Сложность у них разная будет, как ни крути. Вы же сами выше писали, что indexOf не правильно работает с NaN.
Для исправления этого огреха с NaN необходимо проверять каждый элемент массива на isNaN, при этом нужно будет проверить еще и тип элемента, т.к. isNaN('a') == true.
В то время когда Array.indexOf будет сравнивать по ссылке, а в некоторых случаях еще и по значению.
Угу. И судя по результатам, такая проверка у Firefox была (есть) и у indexOf.
Согласен с этим. Но меня удивило, что иногда результаты тестов отличаются на порядок.
Спасибо за ссылки! Жаль вторая не работает, но первая ответила на вопрос, который меня давно интересовал, про то, как сравниваются строки.
Не знаю какие тесты были автора, но начав писать микробенчмарки вы ступаете на очень скользкую дорожку, а результаты могут быть в корне неверными.
Например, можно написать вот такой тест:
http://jsbench.github.io/#0c02e5ebe25ee0374e3736f3289e922a
Или такой (вначале, середине и не найден):
http://jsbench.github.io/#bc19a03c9aeea1dc1f44731396c05396
Так что используйте Array#includes, мифический выигрыш не стоит ухудшения читаемости.
Например, можно написать вот такой тест:
http://jsbench.github.io/#0c02e5ebe25ee0374e3736f3289e922a
Array#includes — WIN!

Или такой (вначале, середине и не найден):
http://jsbench.github.io/#bc19a03c9aeea1dc1f44731396c05396
Ну, можно сказать, что Array#indexOf иногда выигрывает, но в пределах нормы

Так что используйте Array#includes, мифический выигрыш не стоит ухудшения читаемости.
В принципе согласен. Я когда делал тесты, то тоже был уверен, что это не прям отличный показатель производительности. Но я запускал тесты несколько раз и смотрел на общую картину. Тоже считаю, что includes() более правильный метод, если речь идет именно о том содержится ли элемент в массиве. Единственное «но» здесь как обычно — это, то что не во всех браузерах работает. Хотя на сайте ECMAScript предлагается решение этой проблемы
Ухудшения читаемости не происходит. "Программисты", не знакомые с побитовыми операциями мне не друзья.
Ясно, понятно.
"Знаком с побитовыми операциями" !== "умеет читать побитовые операции быстро".
Эй, ну зачем вы так парня минусует, ну горяч, категоричен, бывает. Несколько лет назад тоже иногда так писал, а потом устал и начал более выразительно свою мысль доносить.
Я думаю стоило бы добавить, что Microsoft Edge поддерживает работу includes для массивов и строк, а то IE уже менее актуален в этом плане.
https://developer.microsoft.com/en-us/microsoft-edge/platform/status/arrayprototypeincludeses2016/?q=includes
https://developer.microsoft.com/en-us/microsoft-edge/platform/status/arrayprototypeincludeses2016/?q=includes
В таблице есть IE, но нет EDGE. Тогда можно в строке с IE указать «14.14279» (массивы) и «14.14393» (строки).
Sign up to leave a comment.
JavaScript: includes vs indexOf