2014-09-05 6 views
0

왜 자바 스크립트는 이러한 유형의 오류가 반환 않습니다자바 스크립트 내부 루프 반환 형식 오류에 대한

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

자바 스크립트 우수 사례 : 'in'을 사용하지 마십시오. JavaScript는 여러분이 영원히 단순히'if (foo [i] .active) {...}'처럼 행동하려고하거나, 속성이 명명 된 변수에있는 경우, "propname" ,'if (foo [i] [propname]) {...}'. 그리고 위생을 위해서, 당신은'if (foo [i] && foo [i] .active) {...}' –

+0

고맙습니다. 파이썬에서 오는 것은 정상적인 것처럼 보이지만, 당신이 말하는 것을 볼 수 있습니다. – Garuuk

답변

2

의 값이 undefined로 계산되므로 foo[i]이라는 표현식은 정의되지 않았습니다. (힌트 : i = 4).

문제는 'active' in undefined으로 재현 할 수 있습니다. 루프가 필요하지 않습니다.

이 경우 루프의 조건이 잘못되었습니다. i < foo.length이어야하며 i은 0..3이되고 0..4가 아닙니다.

코드 가능성 또한 로컬 i (감사 RobG!)를 사용해야하는이 break (체크 때 설정된다), (대신 글로벌 추정 사용하는) 함수의 값을 반환하고 /하거나 Array.some로 대체 .

"인쇄 상 오류"로 닫습니다.

+0

Ahhh dang은 그것을 잡지 않았습니다. 그래, 나는 확인 된 값이 사실인지 먼저 확인해야한다. – Garuuk

+2

변수를 지역 변수로 유지하는 것을 고려하십시오. 특히 다음과 같이 카운터를 사용하십시오. 'for (var i = 0, iLen = foo.length, checked = false; iLen &&! checked; i ++) {checked = !! foo [i] &&' foo [i]}'또는 이와 비슷한 것. – RobG