2015-03-14 2 views
1

Я пытаюсь проверить, если массив содержит заданное значение:Почему indexOf в пустом массиве не возвращает -1?

var arr = []; 

if (arr.indexOf(2)) { 
    console.log('yes'); 
} 

Fiddle

Почему если условие всегда выполняется, хотя arr не содержит значение 2? Должен ли он возвращать -1, и поэтому ничего не нужно регистрировать?

+0

В JavaScript 'Boolean (-1) === true', поэтому' Boolean (. [] IndexOf (2)) === true', но 'Boolean ([2] .indexOf (2)) === false'. –

ответ

3

Если запустить этот код в консоли вашего браузера, вы увидите, что он делает возвращения -1. Однако в выражении JavaScript if -1 является правдивым, поэтому будет выполняться предупреждение. Как подробно описано в этой прекрасной JavaScript equality table, есть только очень немногие ценности, которые будут оценивать как ложное в, если заявление: false, 0, "", null, undefined и NaN.

3

Ваше состояние должно быть:

if (arr.indexOf(2) >= 0) 

, потому что в JavaScript, 0 является false, когда соединялись в логическое значение, и любое другое число считается true.

Поэтому ... -1 объединен с true.

alert(!!-1)

1

Он возвращает -1, но -1 в Javascript считается «правдивым».

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

var i = arr.indexOf(2); 
console.log(i); 

Вы должны явно сравнить за несоблюдение равенства -1 в вашем состоянии.

Вот обновленная версия вашего jsfiddle:
http://jsfiddle.net/bmj8y8bj/

Смежные вопросы