Ką reiškia „JSLint klaidos korpusas“, kad jis būtų nutrauktas, jei išraiška?

Aš naudoju JSLint mano „JavaScript“ faile. Jis išmetė klaidą:

 for( ind in evtListeners ) { 

Charakterių eilutės problema 41: „a for in“ kūnas turi būti suvyniotas į teiginį, kad būtų filtruojamos nepageidaujamos prototipo savybės.

Ką tai reiškia?

200
26 дек. 26 d. 2009-12-26 13:49 '09, 13:49 PM 2009-12-26 13:49
@ 8 atsakymai

Visų pirma, niekada nenaudokite „ for in loop“ masyvo sąrašui. Niekada. Naudokite gerą seną for(var i = 0; i<arr.length; i++) .

Taip yra todėl, kad kiekvienas „JavaScript“ objektas turi specialų lauką, vadinamą prototype . Viskas, ką pridėsite prie šio lauko, bus prieinama kiekvienam šio tipo objektui. Tarkime, kad norite, kad visos matricos turėtų naują atvėsti filter_0 funkciją, kuri filtruotų nulius.

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

Ar matote Jis staiga mano, kad filtras_0 yra dar vienas masyvo indeksas. Žinoma, tai nėra skaitinis indeksas, bet for in sąrašus nurodo objektų laukus, o ne tik skaitmeninius indeksus. Taigi, mes išvardiname kiekvieną skaitmeninį indeksą ir filter_0 . Tačiau filter_0 nėra jokio konkretaus masyvo objekto laukas, o dabar kiekvienas masyvo objektas turi šią savybę.

Laimei, visuose objektuose yra hasOwnProperty metodas, kuris patikrina, ar šis laukas tikrai priklauso pačiam objektui arba yra tiesiog paveldėtas iš prototipo grandinės ir todėl priklauso visiems šio tipo objektams.

 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 дек. atsakymas duotas 26 d. 2009-12-26 14:17 '09, 14:17, 2009-12-26 14:17

Douglasas Crockfordas, „jslint“ autorius, daug kartų (ir kalbėjo) rašė apie šį klausimą. Šiame tinklalapio puslapyje yra skyrius, kuriame pateikiama ši informacija:

operatoriui

A klasės operatoriams turėtų būti tokia forma:

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

Pirmoji forma turėtų būti naudojama su matricomis ir kilpomis su iš anksto nustatytu iteracijų skaičiumi.

Antroji forma turi būti naudojama su objektais. Turėkite omenyje, kad į prototipą įtraukiami nariai bus įtraukti į sąrašą. Patartina programuoti programinę įrangą, naudojant hasOwnProperty metodą, kad būtų galima atskirti tikrus objekto narius:

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

„Crockford“ taip pat turi televizijos laidą apie „YUI“ teatrą, kuriame jis apie tai kalba. „Crockford“ serijos „JavaScript“ vaizdo įrašai / pokalbiai turėtų būti vertinami, jei jūs netgi šiek tiek rimtai apie „JavaScript“.

80
26 дек. Atsakymą pateikė Breton 26 d. 2009-12-26 14:41 '09 ne 14:41 2009-12-26 14:41

Netinkamas: (jsHint pateikia klaidą)

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

Geras:

 for (var name in item) { if (item.hasOwnProperty(name)) { console.log(item[name]); } } 
14
10 сент. Atsakymą pateikė Walkerbe 10 Sep. 2015-09-10 14:09 '15 - 14:09 2015-09-10 14:09

Atsakymas į Vava yra ženklas. Jei naudojate jQuery, funkcija $.each() rūpinasi, todėl saugiau ją naudoti.

 $.each(evtListeners, function(index, elem) { // your code }); 
8
30 янв. atsakymą pateikė HRJ sausio 30 d 2010-01-30 09:32 '10 ne 9:32 2010-01-30 09:32

@all - viskas „JavaScript“ yra objektas (), todėl teiginiai, kaip „naudoti tik objektuose“, yra šiek tiek klaidinantys. Be to, „JavaScript“ nėra griežtai parašyta taip, kad 1 == "1" yra teisinga (nors 1 === "1" nėra, Crockford yra didelis). Kai kalbama apie masyvų koncepciją JS, apibrėžimas yra svarbus rašant.

@Brenton - nereikia būti terminų diktatoriumi; "Asociatyvinė matrica", "žodynas", "maišos", "objektas", visos šios programavimo sąvokos taikomos vienai ir tai pačiai JS struktūrai. Tai vardų reikšmių pora (raktas, indeksas), kur vertė gali būti bet kuris kitas objektas (stygos taip pat yra objektai)

Taigi, new Array() atitinka []

new Object() maždaug panašus į {}

 var myarray = []; 

Sukuria struktūrą, kuri yra masyvas su apribojimu, kad visi indeksai (dar žinomi kaip raktai) turi būti sveiki skaičiai. Taip pat galite automatiškai priskirti naujus indeksus naudodami .push ()

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

Geriausiai padaryta su for(initialization;condition;update){

Bet kaip apie:

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

Pabandykite atlikti šiuos veiksmus:

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

Galbūt ne geriausias masyvo panaudojimas, bet tiesiog iliustracija, kad viskas ne visada aiški.

Jei žinote savo raktus ir, žinoma, jei jie nėra sveiki skaičiai, vienintelis objektas, pvz., Struktūra, yra objektas.

 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 дек. atsakymas duotas 10 dec. 2010-12-10 22:41 '10, 10:41 PM 2010-12-10 22:41

Žinoma, šiek tiek kraštutinė pasakyti

... niekada nenaudokite „a“, kol užrašysite masyvą. Niekada. naudoti gerą seną (var i = 0; i <arr.length; i ++)

?

Douglas Crockford ištraukoje būtina skirti skyrių

... Antroji forma turėtų būti naudojama su objektais ...

Jei jums reikia asociatyviosios masyvo (dar žinomas kaip hashtable / žodynas), kur raktų pavadinimai yra vadinami vietoj skaitmeninio indeksavimo, turėsite tai įgyvendinti kaip objektą. var myAssocArray = {key1: "value1", key2: "value2"...}; .

Tokiu atveju myAssocArray.length pasirodo null (nes šis objektas neturi ilgio nuosavybės), o jūsų i < myAssocArray.length nebus labai toli. Be didesnio patogumo, tikiuosi, kad asociatyviosios matricos daugeliu atvejų siūlys našumą, nes masyvo klavišai gali būti naudingos savybės (t. Y. Turinio ar masyvo elemento elemento pavadinimas), o tai reiškia, kad nereikia atlikti kartokite per ilgą masyvą, pakartotinai įvertindami, ar po ataskaitų ieškote masyvo įrašo.

Bet kuriuo atveju, ačiū, kad paaiškinote „JSLint“ klaidų pranešimus, dabar naudosiu „isOwnProperty“ patikrinimą, kai sąveikaujate su daugybe asociacijų masyvų!

1
19 апр. atsakymas pateiktas tomfumb 19 Bal 2010-04-19 17:54 '10, 17:54, 2010-04-19 17:54

Tiesiog pridėkite temą, skirtą / for / $. Kiekvienas, aš pridėjau „jsperf“ testo atvejį, kad galėčiau naudoti $ .each vs už: http://jsperf.com/each-vs-for-in/2

Skirtingos naršyklės / versijos ją apdoroja skirtingai, tačiau atrodo, kad $ .each ir tiesiogiai jiems yra pigiausios našumo parinktys.

Jei naudojate susieti masyvą / objektą iteracijai, žinodami, ko jums reikia ir ignoruojate visa kita, naudokite $ .each, jei naudojate jQuery arba tiesiog (ir tada pertrauka; kai pasiekiate tai, ką žinote, turėtumėte paskutinis elementas)

Jei kartojate masyvą, kad kažką atliktumėte su kiekviena raktų pora, turėtumėte naudoti hasOwnProperty metodą, jei nesinaudojate jQuery ir naudojate $ .each, jei naudojate jQuery.

Visada naudokite for(i=0;i<o.length;i++) jei nereikia asociatyviosios masyvo, nors ... lol chrome tai padarė 97% greičiau nei a for in arba $.each

0
20 мая '11 в 8:40 2011-05-20 08:40 Atsakymą pateikė Benno gegužės 20 d. 11 val. 8:40 2011-05-20 08:40

Tai reiškia, kad evtListeners savybes turite filtruoti naudojant hasOwnProperty metodą .

0
26 дек. Atsakymą pateikė Fabien Ménager . 2009-12-26 14:09 '09, 14:09 2009-12-26 14:09

Kiti klausimai apie „ arba užduoti klausimą