Что делает сокращение "index> = 0 && count ++"? - PullRequest
2 голосов
/ 17 февраля 2012

Я убивал время, читая функции underscore.string , когда обнаружил эту странную стенографию:

function count (str, substr) {
  var count = 0, index;
  for (var i = 0; i < str.length;) {
    index = str.indexOf(substr, i);
    index >= 0 && count++; //what is this line doing?
    i = i + (index >= 0 ? index : 0) + substr.length;
  }
  return count;
}

Legal: Подумайте дважды, прежде чем использовать вышеуказанную функцию, не отдавая underscore.string


Я поставил здесь одну строку, чтобы вы не тратили время на ее поиск:

index >= 0 && count++;

Я никогда не видел ничего подобного. Я не знаю, что делаю.

Ответы [ 3 ]

6 голосов
/ 17 февраля 2012
index >= 0 && count++;

Первая часть: index >= 0

возвращает true, если index имеет значение, которое больше или равно 0.

Вторая часть: a && b

большинство языков в стиле C сокращают логические операторы || и &&.

Для операции || вам нужно только знать, что первый операнд - true ився операция вернет true.

Для операции && вам нужно только знать, что первый операнд равен false, а вся операция вернет false.

* 1025.* Третья часть: count++

count++ эквивалентно count += 1 эквивалентно count = count + 1

Все вместе теперь

Если первый операнд (index >= 0) строки оценивается как true, второй операнд (count++) оценивает, поэтому он эквивалентен:

if (index >= 0) {
  count = count + 1;
}

нюансы JavaScript

JavaScript отличается от других Cязыки стиля в том смысле, что он имеет концепцию значений truthy и falsey.Если значение оценивается как false, 0, NaN, "", null или undefined, оно равно falsey;все остальные значения: truthy.

|| и && операторы в JavaScript не возвращают логические значения, они возвращают последний выполненный операнд.

2 || 1 вернет 2, поскольку первый операнд возвратил значение truthy, true или что-либо еще, всегда вернет true, поэтому больше не нужно выполнять операцию.В качестве альтернативы null && 100 вернет null, поскольку первый операнд вернул значение falsey.

6 голосов
/ 17 февраля 2012

Это эквивалентно:

if (index >= 0) {
    count = count + 1;
}

&& - логический оператор AND. Если index >= 0 истинно, то также оценивается правая часть, что увеличивает count на единицу.
Если index >= 0 равно false, правая часть не оценивается, поэтому count не изменяется.

Кроме того, && на немного быстрее, чем if метод, как видно из этого JSPerf .

4 голосов
/ 17 февраля 2012

Это то же самое, что и:

if(index >= 0){
    count++;
}

JavaScript будет оценивать левую сторону (index >= 0), если false, то && (И) будет короткое замыкание (так как ложное И все, чтоfalse), таким образом, не работает `count ++.

. Если это (index >= 0) true, он оценивает правую сторону (count++), а затем просто игнорирует вывод.

...