예기치 않은 JavaScript 가능한 반복


83

다음 코드가 있습니다.

  for (i in awards) {
         if (awards[i] instanceof Array === false) {
               console.log(awards[i]);
                httpFactory.patch(awards[i], {"read": true}, false);
             }
       }

내 IDE는 위 코드와 관련된이 오류를 표시합니다.

예상치 못한 (사용자 지정 / 상속 된) 멤버에 대해 가능한 반복, 아마도 hasOwnProperty 검사 누락

JavaScript에서 필터링되지 않은 for-in 루프의 인스턴스를 확인합니다. 이 구성을 사용하면 상속되거나 예기치 않은 속성이 처리됩니다. hasOwnProperty () 메서드를 사용하여 자체 속성을 필터링해야합니다. 유효성 검사는 JavaScript, html 또는 jsp 파일에서 작동합니다.

이 진술이 의미하는 바를 더 자세히 설명해 주시겠습니까?


2
jQuery를 수행하지 않는 hasOwnProperty검사 - 내가 생산 얼마나 많은 경고를 궁금해 ....
알니 타크

답변:


145

IDE는 테스트를 추가 할 것을 권장합니다.

if (awards.hasOwnProperty(i)) {
    ...
}

for루프 내부 .

개인적으로이 작업을 수행하지 않고 가능하면 경고를 비활성화하는 것이 좋습니다. 대부분의 코드에는 단순히 필요하지 않으며 다음을 사용하여 객체에 열거 할 수없는 속성을 안전하게 추가 할 수있는 ES5 코드의 필요성이 훨씬 적습니다.Object.defineProperty

hasOwnProperty검사는에 새 (열거 가능한) 속성을 안전하지 않게 추가 한 경우에만 필요 Object.prototype하므로 가장 간단한 수정은 그렇게하지 않는 것입니다 .

jQuery는이 테스트를 수행하지 않습니다. jQuery 가 안전하지 않게 수정 되면 중단 될 것이라고 명시 적으로 문서화 합니다 Object.prototype.


41
IntelliJ 15에서 경고를 비활성화하려면 다음을 수행하십시오. 환경 설정-> 편집기-> 코드 스타일-> 검사를 엽니 다. 검색 창에 "hasOwnProperty"를 입력합니다. "Unfiltered for..in loop"가 표시됩니다. 해당 상자를 선택 취소하십시오. 확인 버튼을 클릭하여 변경 사항을 적용하고 창을 닫습니다.
Machtyn

2
IntelliJ에서 : CTRL ALT S (자체 CTRL ALT S 단축키가있는 Ubuntu를 사용하지 않는 한) "hasOwnProperty"를 검색하면 문제가 바로 나타나고 선택을 취소하면 완료됩니다!
Olivier Pons 2017 년

1
WebStorm에서 파일 ... 설정으로 이동 한 다음 편집기-> 검사-> "JavaScript 및 TypeScript"-> 일반으로 이동하고 "필터링되지 않은 for..in 루프"를 선택 취소합니다.
mightypile

21

자바 스크립트의 모든 객체는 자체 속성 (네이티브 / 상속 메소드 / 속성)을 가진 프로토 타입과 객체 자체에 직접 연결된 속성을 가지고 있습니다.

객체를 반복하면 객체 자체의 속성과 객체 프로토 타입의 속성이 반복됩니다.

따라서 프로토 타입에 대한 반복을 피하기 위해 객체에 언급 된 속성이 직접있을 때만 true를 반환 하는 hasOwnProperty 메서드 를 사용하는 것이 좋습니다 . ie, Not inside prototype

for (var k in object) {
  if (object.hasOwnProperty(k)) {
     // do your computation here.
  }
}

자세한 내용은 여기에서 확인할 수 있습니다 .


13

루프를 다음과 같이 리팩터링 할 수도 있습니다.

const keys = Object.keys(object);
for (const key of keys){
   // do something with object[key];
}

3

또한 더 읽기 쉽고 기능적인 접근을 위해 forEach 루프를 작성하는 경고를 제거 할 수 있습니다.

Object.keys(object).forEach(key => {
    // Do something with object[key]
});

-2

이 루프의 시작 부분에 조건을 하나 더 추가해야합니다.

if (awards.hasOwnProperty(i)) 

13
나는이 답변에 찬성 투표를했기 때문에 이유를 말하면 정중하다고 생각합니다. 이 대답은 경고를 피하는 방법을 말하지만 경고가 의미하는 바, 경고를 피하는 방법 또는이 코드가 수행하는 작업을 설명하지 않습니다.
WoodenKitty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.