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_0
filter_0
는 특정 어레이 객체의 필드가 아닙니다.모든 어레이 객체에 이 속성이 있습니다.
은 행행 a a a a a a a a a a a 가 있다.hasOwnProperty
method: 이 필드가 실제로 개체 자체에 속하는지 또는 단순히 프로토타입 체인에서 상속되어 해당 유형의 모든 개체에 속하는지 확인합니다.
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
'programing' 카테고리의 다른 글
휴지 상태 - 요청된 클래스 org.mariadb.jdbc를 로드할 수 없습니다.드라이버 (0) | 2022.10.04 |
---|---|
반사를 사용하여 방법이 정적인지 어떻게 확인할 수 있습니까? (0) | 2022.10.04 |
재귀 쿼리에 CTE 적용 (0) | 2022.10.04 |
데이터 프레임 열에서 값이 발생하는 빈도 카운트 (0) | 2022.10.04 |
Vuex - 변환 핸들러를 무시하고 항상 저장 데이터를 직접 변환하는 것이 좋은 생각입니까? (0) | 2022.10.04 |