"JSLint səhv bədəni" ifadəsində ifşa edilmək üçün nə deməkdir?

JSLint'i javascript dosyamda istifadə etdim . Hata atdı:

 for( ind in evtListeners ) { 

Character string problem 41: Prototipin istenmeyen xüsusiyyətlərini süzgəc üçün ifa bir if ifadəsinə bükülmüş olmalıdır.

Bu nə deməkdir?

200
26 дек. jrharshath tərəfindən təyin 26 dekabr . 2009-12-26 13:49 '09 at 13:49 2009-12-26 13:49
@ 8 cavab

Birincisi, heç bir döngüdə heç bir sıra istifadə for in . Heç vaxt. Yaxşı köhnədən istifadə edin for(var i = 0; i<arr.length; i++) .

Bunun səbəbi aşağıdakılardır: JavaScript-də hər bir obyekt prototype adlı xüsusi bir sahəyə malikdir. Bu sahədə əlavə etdiyiniz hər şey bu cür hər bir obyekt üçün istifadə oluna bilər. Bütün dizilərin filter_0 imkan verəcək yeni bir sərin filter_0 funksiyası olmasını filter_0 .

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

Görürsənmi? Birdən düşünürəm ki, filter_0 başqa bir sıra indeksidir. Əlbəttə ki, bu, həqiqətən, sayısal göstəricidir, lakin sadəcə sayısal göstəricilərlə deyil, obyektlərin sahələrində siyahılar üçün. Beləliklə, hər ədədi endeks və filter_0 siyahısına daxil filter_0 . Lakin filter_0 hər hansı bir array obyektinin bir sahəsi deyil, hər bir array obyekti artıq bu xüsusiyyətə malikdir.

Xoşbəxtlikdən, bütün obyektlər bu sahədə həqiqətən obyektin özünə aid olub-olmadığını və ya prototip zəncirindən sadəcə miras alındığını hasOwnProperty və bu hasOwnProperty bu hasOwnProperty obyektlərin hər hasOwnProperty aid olan hasOwnProperty metoduna malikdir.

 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 
367
26 дек. Cavab 26 dekabrda verilir . 2009-12-26 14:17 '09 at 14:17 'da 2009-12-26 14:17

Jslint'in müəllifi Douglas Crockford, bu sual haqqında bir neçə dəfə yazmışdır (və danışdı). Veb saytının bu səhifəsini əhatə edən bir bölmə var:

operator üçün

A operatorların sinfi üçün aşağıdakı forma olmalıdır:

 for (initialization; condition; update) { statements } for (variable in object) { if (filter) { statements } } 

Birinci forma əvvəlcədən müəyyən edilmiş təkrarlama sayları ilə dizilər və döngələrlə istifadə edilməlidir.

İkinci forma obyektlərlə istifadə olunmalıdır. Prototip obyektinə əlavə olunan üzvlərin siyahısı daxil olacağını unutmayın. Bir obyektin əsl üzvlərini ayırmaq üçün hasOwnProperty metodundan istifadə edərək müdafiə proqramı tətbiq edilməlidir:

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

Crockford da YUI Teatrı haqqında bir televiziya şousu var. Javascript haqqında bir az ciddi olsa da, Crockford seriyası javascript video / söhbətləri görsənməlidir.

80
26 дек. Cavab 26 dekabrda Breton tərəfindən verilir . 2009-12-26 14:41 '09 at 14:41 'da 2009-12-26 14:41

Bad: (jsHint səhv verir)

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

Yaxşı:

 for (var name in item) { if (item.hasOwnProperty(name)) { console.log(item[name]); } } 
14
10 сент. Cavab walkerbe 10 sentyabr tərəfindən verilir. 2015-09-10 14:09 '15 at 14:09 2015-09-10 14:09

Vava-a verilən cavab işarələ. Əgər jQuery istifadə edirsinizsə, $.each() funksiyası bu məsələyə diqqət yetirir, buna görə istifadə etmək daha təhlükəsizdir.

 $.each(evtListeners, function(index, elem) { // your code }); 
8
30 янв. cavabı HRJ tərəfindən Jan 30 verilir 2010-01-30 09:32 '10 at 9:32 2010-01-30 09:32

@all - JavaScript-də hər şey bir obyektdir (), belə ki, "yalnız obyektlərdən istifadə" kimi ifadələr bir az yanlışdır. Bundan əlavə, JavaScript 1 == "1" doğru olduğu üçün (baxmayaraq ki, 1 === "1" deyil, Crockford böyükdür). JS-də dizilərin pro-konsepsiyasına gəldikdə, tərifdə yazma vacibdir.

@Brenton - şərtlərin diktatoru olmağa ehtiyac yoxdur; "birləşmə array", "lüğət", "hash", "obyekt", bütün bu proqramlaşdırma konsepsiyaları JS-də eyni quruluşa tətbiq edilir. Bu dəyər hər hansı bir digər obyekt ola bilər (string də obyektlər) olduğu bir neçə ad dəyərləri (əsas, indeks)

Belə ki, new Array() matçları []

new Object() {} kabaca oxşar {}

 var myarray = []; 

Bütün göstəricilərin (aka düymələri) tamsayı olması şərtilə məhdudiyyətləri olan bir sıra olan bir quruluş yaradır. Ayrıca, avtomatik olaraq .push () istifadə edərək yeni indekslər təyin etməyə imkan verir.

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

Ən yaxşı for(initialization;condition;update){

Ancaq necə olar:

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

Aşağıdakıları cəhd edin:

 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]); } } 

Yəqin ki, bir sıra ən yaxşı istifadə deyil, sadəcə bir şey aydın deyil ki, bir illüstrasiya.

Açarlarınızı bilirsinizsə və mütləq tamsayı olmadıqsa, bir quruluş kimi bir obyekt bir obyektdir.

 var i, myarray= { "first":"john", "last":"doe", 100:"foo", 150:"baz" }; for(i in myarray){ if(myarray.hasOwnProperty(i)){ alert(i+" : "+myarray[i]); } } 
6
10 дек. Cavab 10 dekabrda verilir . 2010-12-10 22:41 '10 at 10:41 PM 2010-12-10 22:41

Əlbəttə ki, demək bir az həddindən artıq

... bir sıra listelemek üçün bir müddət loop istifadə etməyin. Heç vaxt. (var i = 0; i <arr.length; i ++)

?

Douglas Crockford'un ekranda bir bölüm ayırmaq lazımdır

... İkinci forma obyektlərlə istifadə edilməlidir ...

Birincil dizine ehtiyac duyarsanız (aka hashtable / dictionary), burada numeric indexing əvəzinə düymələrin adları deyilirsə, məsələn, bu bir obyekt kimi tətbiq etməlisiniz. var myAssocArray = {key1: "value1", key2: "value2"...}; .

Bu halda, myAssocArray.length null görünür (bu obyekt uzunluğu mülkiyyəti olmadığı üçün) və i < myAssocArray.length çox uzaq olmayacaq. Daha çox rahatlıq təmin etməklə yanaşı, bir sıra hallarda birləşməli dizilərin performans fayda verməsini gözləyərdim, çünki array düymələri faydalı xüsusiyyətlər ola bilər (məsələn, bir element elementinin elementi və ya adı), yəni yerinə yetirmək lazım deyil bir array qeydini axtarmaq üçün ifadələrdən sonra olduğunuzu təkrarlayaraq uzun bir sıra üzərində yineleyin.

Hər halda, JSLint səhv mesajlarını izah etmək üçün də təşəkkür edirəm, çox sayda birləşmə dizilerimlə qarşılaşdığınız zaman 'isOwnProperty' 'düyməsini istifadə edəcəyəm!

1
19 апр. Cavab 19 aprel tarixində verilir 2010-04-19 17:54 '10 at 17:54 2010-04-19 17:54

Yalnız / for / $ üçün mövzunu əlavə etmək üçün. Hər birinə, mən $ .each vs istifadə etmək üçün bir jsperf testi əlavə etdi: http://jsperf.com/each-vs-for-in/2

Fərqli brauzerlər / versiyalar fərqli şəkildə idarə olunur, ancaq $ .each və onlar üçün birbaşa ucuz performans variantları görünür.

Bir array / obyektin birləşməsi üçün istifadə edərkən, lazım olanı bilib və hər şeyi görməməzlikdən istifadə edirsinizsə, $ istifadə edin., JQuery istifadə edirsinizsə və ya yalnız (və sonra qırxın), bildiyinizə çatdıqda, son element)

Hər bir əsas cüt ilə bir şey etmək üçün bir sıra vasitəsilə yineleyicisinizsə, jQuery istifadə etmirsinizsə və hasisə $ .eq istifadə edirsinizsə, hasOwnProperty metodundan istifadə etməlisiniz.

Lol xrom 97% daha sürətli və ya $.each dan daha yaxşı bir şey etdiyinə baxmayaraq, hər zaman istifadə for(i=0;i<o.length;i++) istifadə edin.

0
20 мая '11 в 8:40 2011-05-20 08:40 Cavab Benno tərəfindən 20 May 'da 8:40' də verildi. 2011-05-20 08:40

Bu , hasOwnProperty metodundan istifadə edərək , evtListeners xüsusiyyətlərini filtrelemelisiniz.

0
26 дек. Cavab Fabien Ménager tərəfindən verilir 26 dekabr. 2009-12-26 14:09 '09 at 14:09 2009-12-26 14:09

bağlı digər suallar və ya bir sual