다음 코드가 있습니다.
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 메서드 를 사용하는 것이 좋습니다 . ie, Not inside prototype
예
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];
}
답변
또한 더 읽기 쉽고 기능적인 접근을 위해 forEach 루프를 작성하는 경고를 제거 할 수 있습니다.
Object.keys(object).forEach(key => {
// Do something with object[key]
});
답변
이 루프의 시작 부분에 조건을 하나 더 추가해야합니다.
if (awards.hasOwnProperty(i))