Почему в JavaScript срабатывает else?

Помогите разобраться окуда ноги растут, есть такой код на JavaScript

Array.prototype.itemNumber = function(item) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] == item) {
            return i;
        }
        else {
            return -1;
        }
    }
}

var arr = new Array(1, 9, 7, 4, "banana", "orange");

console.log(arr.itemNumber("banana"));


Почему каждый раз возвращается -1, даже если условие if удовлетворяется, но если переписать код вот так, то все замечательно работает

Array.prototype.itemNumber = function(item) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] == item)
            return i;
    }
    return -1;
}

var arr = new Array(1, 9, 7, 4, "banana", "orange");

alert(arr.itemNumber("banana"));
  • Вопрос задан
  • 3008 просмотров
Решения вопроса 3
Anonym
@Anonym
Программирую немного )
Первый код вернет индекс только, если первый элемент в массиве будет соответствовать условию. Иначе на первом элементе сработает return -1; и цикл завершится.
Ответ написан
Комментировать
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Простыми словами - в цикле у тебя if () else () , а значит что на каждой итерации он обязательно зайдет либо в if () либо в else() а у тебя там в обоих случаях return, следовательно твой цикл бессмысленнен, т.к. дальше одной итерации он никогда не зайдет.
Ответ написан
Комментировать
первый аргумент не равен "banana", срабатывает else, retrurn завершает выполнение функции.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
trueClearThinker
@trueClearThinker
Цикл можно написать более оптимально:
for(var i = 0, l = this.length; i < l && this[i] != item; i++);
if(i < l)
  return i;
return -1;
Ответ написан
miraage
@miraage
Старый прогер
Я что-то не понимаю, или Вы пишете функцию Array.prototype.indexOf ?
Ответ написан
Комментировать
И вообще используйте лучше Array.prototype.findIndex из ECMAScript 6, тем более, что в Fx25 он уже реализован нативно:

if(!Array.prototype.findIndex)
    Array.prototype.findIndex=function(predicate) {
		var list=Object(this);
		var length=list.length>>>0;//ES.ToUint32
		if(length===0)
			return -1;
		if(typeof predicate !== "function")
			throw new TypeError("Array#findIndex: predicate must be a function");
		var thisArg=arguments[1];
		for(var i=0, value; i<length && i in list; i++){
			value=list[i];
			if(predicate.call(thisArg, value, i, list))
				return i;
		}
		return -1;
	}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы