programing

JSLint 오류 '의 본문을 if 문으로 감싸야 한다'는 것은 무엇을 의미합니까?

itsource 2022. 10. 4. 23:17
반응형

JSLint 오류 '의 본문을 if 문으로 감싸야 한다'는 것은 무엇을 의미합니까?

저는 JSLint를 JavaScript 파일로 사용했습니다.에러가 발생했습니다.

for( ind in evtListeners ) {

41행의 문제 문자 9: 의 본문을 if 문으로 감싸 프로토타입에서 불필요한 속성을 필터링해야 합니다.

이것은 무엇을 의미합니까?

우선, 절대 사용하지 마십시오.for in을 사용하여 loop을 합니다. 돼요. old old를 하세요.for(var i = 0; i<arr.length; i++).

의 각 에는 그음음음음 called called called called called라는 특별한 . 자바스크립트prototype. 한 모든 은 해당 수 필드에 추가한 모든 항목은 해당 유형의 모든 개체에서 액세스할 수 있습니다.할 수 .filter_0을 .

Array.prototype.filter_0 = function() {
    var res = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i] != 0) {
            res.push(this[i]);
        }
    }
    return res;
};

console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]

이는 개체를 확장하고 새 메서드를 추가하는 표준 방법입니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★어떻게 하는지 한 번 볼까요?for in"이것들"은 다음과 같습니다.

var listeners = ["a", "b", "c"];
for (o in listeners) {
    console.log(o);
}
//prints:
//  0
//  1
//  2
//  filter_0

"어레이인덱스로 됩니다.필터_0을 사용하다 인덱스는 숫자 인덱스는 .for in는 숫자 인덱스뿐만 아니라 개체 필드를 통해 열거합니다.그래서 우리는 모든 숫자 인덱스를 통해 열거하고 있습니다. filter_0filter_0는 특정 어레이 객체의 필드가 아닙니다.모든 어레이 객체에 이 속성이 있습니다.

은 행행 a a a a a a a a a a a 가 있다.hasOwnPropertymethod: 이 필드가 실제로 개체 자체에 속하는지 또는 단순히 프로토타입 체인에서 상속되어 해당 유형의 모든 개체에 속하는지 확인합니다.

for (o in listeners) {
    if (listeners.hasOwnProperty(o)) {
       console.log(o);
    }
}
 //prints:
 //  0
 //  1
 //  2

이 코드는 어레이에 대해 예상대로 동작하지만 절대로 사용하지 마십시오.for in ★★★★★★★★★★★★★★★★★」for each in어레이용입니다.하세요.for in는 배열 인덱스나 값이 아닌 개체의 필드를 열거합니다.

var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";

for (o in listeners) {
    if (listeners.hasOwnProperty(o)) {
       console.log(o);
    }
}

 //prints:
 //  0
 //  1
 //  2
 //  happy

jslint의 저자 Douglas Crockford는 이 문제에 대해 여러 번 글을 썼다.그의 웹사이트 이 페이지에는 다음과 같은 섹션이 있습니다.

스테이트먼트의 경우

스테이트먼트 클래스의 A는 다음 형식을 가져야 합니다.

for (initialization; condition; update) {
    statements
}

for (variable in object) {
    if (filter) {
        statements
    } 
}

첫 번째 형식은 어레이 및 미리 결정 불가능한 반복 횟수의 루프와 함께 사용해야 합니다.

두 번째 양식은 객체와 함께 사용해야 합니다.개체의 프로토타입에 추가된 멤버는 열거에 포함됩니다.hasOwnProperty 메서드를 사용하여 개체의 진정한 멤버를 구별하여 방어적으로 프로그래밍하는 것이 좋습니다.

for (variable in object) {
    if (object.hasOwnProperty(variable)) {
        statements
    } 
}

크록포드는 또한 YUI 극장에서 이 이야기를 하는 비디오 시리즈도 가지고 있다.Javascript에 대한 Crockford의 일련의 비디오/토크는 당신이 Javascript에 대해 조금이라도 진지하다면 꼭 봐야 한다.

불량: (jsHint가 오류를 발생시킵니다)

for (var name in item) {
    console.log(item[name]);
}

양호:

for (var name in item) {
  if (item.hasOwnProperty(name)) {
    console.log(item[name]);
  }
}

바바사용하는 jQuery는$.each()기능이 이를 처리하므로 사용하기에 안전합니다.

$.each(evtListeners, function(index, elem) {
    // your code
});

@all - JavaScript의 모든 것은 오브젝트()이기 때문에 "오브젝트에 대해서만 사용"과 같은 문장은 약간 오해의 소지가 있습니다.또한 JavaScript는 1 == "1"이 참이 되도록 강하게 입력되지 않습니다(1 === "1"이 참이 아님에도 불구하고, Crockford는 이 점에서 중요합니다).JS에서 배열의 자동 개념에 관해서는 정의에 입력이 중요합니다.

@Brenton - 용어집 독재자일 필요는 없습니다. "associative array", "dictionary", "hash", "object" 등의 프로그래밍 개념은 모두 JS의 한 구조에 적용됩니다.이름(키, 인덱스) 값 쌍입니다.여기서 값은 다른 오브젝트(문자열도 오브젝트)가 될 수 있습니다.

so,는,new Array() is is is is is와 []

new Object()으로 비슷합니다.{}

var myarray = [];

모든 인덱스(일명 키)가 정수여야 한다는 제한이 있는 배열인 구조를 만듭니다.또한 .push()를 통해 새로운 인덱스를 자동으로 할당할 수도 있습니다.

var myarray = ["one","two","three"];

실제로 가장 잘 처리되는 방법은for(initialization;condition;update){

하지만 다음 사항은요?

var myarray = [];
myarray[100] = "foo";
myarray.push("bar");

이것을 시험해 보세요.

var myarray = [], i;
myarray[100] = "foo";
myarray.push("bar");
myarray[150] = "baz";
myarray.push("qux");
alert(myarray.length);
for(i in myarray){
    if(myarray.hasOwnProperty(i)){  
        alert(i+" : "+myarray[i]);
    }
}

아마도 어레이의 최선의 사용법은 아니지만, 사물이 항상 명확하지는 않다는 것을 보여주는 삽화일 것이다.

키를 알고 있고, 반드시 정수가 아닐 경우 어레이와 같은 구조 옵션은 객체뿐입니다.

var i, myarray= {
   "first":"john",
   "last":"doe",
   100:"foo",
   150:"baz"
};
for(i in myarray){
    if(myarray.hasOwnProperty(i)){  
        alert(i+" : "+myarray[i]);
    }
}

한 줄 하지 않습니다.for .. in쓸모 없는.그냥 사용하다Object.keys(obj).forEach(key => {}★★★★★★ 。

물론 좀 과격하긴 하지만

...배열을 열거하려면 for in loop을 사용하지 마십시오.아니요. 다음에 대해 good old 사용(var i = 0; i <arr.length; i++)

?

Douglas Crockford 추출물에 있는 부분을 강조할 가치가 있습니다.

...두 번째 양식은 물체와 함께 사용해야 합니다...

인덱스가 키가 /)이한 경우 를 들어, 「」(hashtable / dictionary)」 입니다.var myAssocArray = {key1: "value1", key2: "value2"...};.

이 경우myAssocArray.length(이 오브젝트에는 '길이' 속성이 없기 때문에) null로 표시됩니다.i < myAssocArray.length멀리는 못 갈 거야어레이 키는 유용한 속성(어레이 멤버의 ID 속성이나 이름 등)이 될 수 있기 때문에 편리성이 향상될 뿐만 아니라 많은 상황에서 관련 어레이가 퍼포먼스의 이점을 얻을 수 있을 것으로 기대됩니다.즉, 어레이 엔트리를 검출하기 위한 스테이트먼트를 반복적으로 평가할 필요가 없습니다.음.정말.

어쨌든 JSLint 오류 메시지에 대한 설명도 감사합니다.무수한 어소시에이션 어레이를 인터랙티브 할 때는, 「ISOwnProperty」체크를 사용합니다.

즉, hasOwnProperty 메서드를 사용하여 evtListeners 속성을 필터링해야 합니다.

for in/for/$의 토픽에 덧붙여 $.each와 for in:http://jsperf.com/each-vs-for-in/2를 사용하는 jsperf 테스트 케이스를 추가했습니다.

브라우저/버전에 따라 처리 방법은 다르지만, 각각 $, 즉 in이 퍼포먼스 면에서 가장 저렴한 옵션인 것 같습니다.

에서 를 사용하여 관련 어레이/개체를 통해 반복하고 있는 경우, 무엇을 찾고 있는지 알고 있고 다른 모든 것을 무시하고 있는 경우 jQuery를 사용하는 경우 각각 $.를 사용합니다.또한 in에 대해서만 사용합니다(이러다 도달하면 마지막 요소가 됩니다).

배열을 통해 각 키쌍을 사용하여 작업을 반복하는 경우 jQuery를 사용하지 않으면 hasOwnProperty 메서드를 사용하고 jQuery를 사용하지 않으면 각각 $.를 사용해야 합니다.

「」를 사용합니다.for(i=0;i<o.length;i++)은 a 또는 lol chrome a보다 되었습니다.$.each

언급URL : https://stackoverflow.com/questions/1963102/what-does-the-jslint-error-body-of-a-for-in-should-be-wrapped-in-an-if-statemen

반응형