2012-03-21 2 views
1

Что в этом плохого?проверка строкового элемента в массиве javascript

var colours = ['red','green', 'blue'] 
console.log('blue' in colours); // outputs false 

Он выводит false, я бы подумал, что это должно быть trye.

Благодаря

+1

Проблема заключается в том, что 'в' оператор в JavaScript не так хорошо, как это, например, в Python. – ThiefMaster

ответ

6

Так как вы имеете дело с Array там вы не можете проверить это таким образом. Arrays предлагает вам метод Array.prototype.indexOf, чтобы определить, действительно ли что-то там:

console.log(colours.indexOf('blue') > -1); 

Объяснение:

Массивы в ECMAScript только специализированные Objects. Это означает, что ваш массив действительно выглядит

colours = { 
    0: 'red', 
    1: 'green', 
    2: 'blue' 
}; 

Поскольку in оператор проверяет только для объекта keys, вы не можете проверить значения с ней. Вы действительно можете проверить, например, if('1' in colours) (который вернет true), но это не имеет большого смысла. Опять же, используйте .indexOf() для массивов.

Примечание: ECMAscript Harmony (ES.Next, или ES6) будет давать цикл for of, который вместо ключей перечисляет значения объектов. Я не совсем уверен, можем ли мы использовать оператор of так же, как in, но это было бы очень полезно.

1

Использование colours.indexOf('blue').

1

Это будет работать только с объектами. Он проверяет, имеет ли объект свойство.

var colours = { red: 123, green: true, blue: "foo"};; 
console.log("blue" in colours); 

Использование indexOf в современных браузерах:

var colours = ['red','green', 'blue']; 
console.log(colours.indexOf("blue") != -1); 
Смежные вопросы