2014-09-05 1 views
0

Почему Javascript вернуть эту ошибку типа:Javascript «в» оператора внутри для ошибки типа возвращает цикл

TypeError: Cannot use 'in' operator to search for 'active' in undefined 

, когда я делаю что-то вроде этого

foo = [ 
      {link:"http1", active:"true"}, 
      {link:"http2", active:"true"}, 
      {link:"http3"} 
     ] 

    var checker = function(){ 

     for(i=0; i<= foo.length; i++){ 
      if('active' in foo[i]){ 
       checked = true 
      } 
     } 
    } 

, но когда я делаю это в консоли с тем же самым объектом foo

'active' in foo[0] 

оно возвращает true?

+0

Передовая практика JavaScript: не используйте 'in'. JavaScript поддерживает то, что вы пытаетесь сделать с тех пор, как просто 'if (foo [i] .active) {...}', или если свойство находится в именованной переменной, давайте притворимся, что у нас есть один вызов "propname" , 'if (foo [i] [propname]) {...}'. И для здравомыслия вы делаете 'if (foo [i] && foo [i] .active) {...}' –

+0

Спасибо. Исходя из python, кажется нормальным делать «in», но я вижу, что вы говорите. – Garuuk

ответ

2

Ошибка говорит, что выражение foo[i] не определено - потому что выражение делает оценивается как неопределенное. (Подсказка: i = 4).

Тривиально проблема воспроизводится с 'active' in undefined, не требуется петли.

Причина в этом случае является неправильным условием для цикла: оно должно быть i < foo.length, поэтому i идет 0..3, а не 0..4.

Код должен, вероятно, также использовать локальную i (спасибо RobG!), А break (при проверке установлена), возвращает значение из функции (вместо того, чтобы использовать предполагаемый глобальный), и/или заменить Array.some ,

Теперь также закрытие как «типографская ошибка».

+0

Ahhh dang этого не поймал. Yup имеет смысл, я должен был проверить, чтобы убедиться, что проверенное значение было истинным первым. – Garuuk

+2

Рассмотрите возможность сохранения переменных локально, особенно счетчиков: 'for (var i = 0, iLen = foo.length, checked = false; i RobG