program tip

예기치 않은 JavaScript 가능한 반복

radiobox 2020. 12. 11. 08:00
반응형

예기치 않은 JavaScript 가능한 반복


다음 코드가 있습니다.

  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 파일에서 작동합니다.

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


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

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

for루프 내부 .

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

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

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


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

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

따라서 프로토 타입에 대한 반복을 피하기 위해 객체가 언급 된 속성을 직접 가질 때만 true를 반환 하는 hasOwnProperty 메서드 를 사용하는 것이 좋습니다 . 즉, 프로토 타입 내부가 아님

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

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


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

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

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

if (awards.hasOwnProperty(i)) 

참고 URL : https://stackoverflow.com/questions/25723674/javascript-possible-iteration-over-unexpected

반응형