Javascript hər bir sıra üçün?

Javascript istifadə edərək bir sıra bütün girişləri necə baxa bilərəm?

Mən bu kimi bir şey olduğunu düşündüm:

 forEach(instance in theArray) 

Array mənim theArray , lakin səhv görünür.

4041
17 февр. Dante1986 17 fevralda təyin olundu 2012-02-17 16:51 '12 at 16:51 2012-02-17 16:51
@ 32 cavab
  • 1
  • 2

Tl; DR

  • Qorunma ilə istifadə etmədiyiniz halda for-in ya heç olmasa bilmirsinizsə, onda istifadə etməyin.
  • Ən yaxşı bahisləriniz adətən

    • for-of loop (yalnız ES2015 + üçün),
    • Array#forEach ( spec | MDN ) (və ya onun qohumları və some ) (yalnız ES5 +)
    • loops for sadə köhnə moda,
    • və ya qorunması ilə for-in girişi təmin edir.

Ancaq araşdırmaq, oxumaq üçün çox şey var ...


JavaScript, dizi dövründəki dəyişən diziləri və obyektləri üçün güclü semantiklərə malikdir. Cavabımı iki hissəyə bölürdüm: orijinal dizilər üçün variantlar və obyektlər, digər ermekli obyektlər (ES2015 +), DOM koleksiyonları və s. Kimi arraylara oxşar olan şeylər üçün variantlar.

ES2015-ni ES5-ə göndərməklə ES2015 variantlarını, hətta ES5 mühərriklərində də istifadə edə bilərsiniz. Daha ətraflı məlumat üçün "ES2015 transpiling" / "ES6 transpiling" tapın ...

Yaxşı, seçimlərimizə baxın:

Real array üçün

ECMAScript 5 ("ES5"), bu anda ən geniş yayılmış versiya və ECMAScript 2015- də iki daha əlavə ("ES2015", "ES6") üç variant var:

  1. Hər biri və əlaqəli (ES5 +) üçün istifadə edin
  2. Döngə for sadə istifadə edin
  3. Düzgün şəkildə istifadə edin
  4. For for-of istifadə (örtülü iteratordan istifadə edin) (ES2015 +)
  5. Iteratordan açıq şəkildə istifadə edin (ES2015 +)

Ətraflı:

1. Hər bir və üçün forEach

ES5 tərəfindən əlavə olunmuş Array funksiyalarına (doğrudan və yaxud poliplərin doldurulması ilə) daxil olan hər hansı bir müddətsiz müasir mühitdə (yaxşı, IE8-də deyil), forEach ( spec | MDN ) istifadə edə bilərsiniz:

 var a = ["a", "b", "c"]; a.forEach(function(entry) { console.log(entry); }); 

forEach bir geri çağırma funksiyasını qəbul edir və isteğe bağlı olaraq, bu geri çağırışı çağırırkən (yuxarıda istifadə edilməyən) bu kimi istifadə olunan bir dəyərdir. Geri çağırma sütundakı hər giriş üçün çağırılmış sütunlarda qeyri-mövcud girişləri atmaq üçün çağırılır. Yuxarıda göstərilən təkrar bir argümanı istifadə etsəm də, geri çağırış üç ilə çağırılır: hər bir qeydin dəyəri, bu qeydin indeksləri və təkrar etdiyiniz sıra (əgər funksiyanız artıq olmadıqda) bağlantısıdır.

IE8 (NetApps bu yazının 2016-cı ilin sentyabr ayı dövründə bazarın 4% -dən çoxunu göstərir) kimi köhnə brauzerləri dəstəkləməsinizsə, xoşbəxtlikdən bir səhifə düzeni olmadan universal web səhifəsində istifadə edə bilərsiniz. Köhnəlmiş brauzerləri dəstəkləməlisinizsa, hər hansı bir əməliyyat üçün parlaq / polifilləşdirmə etmək asandır (bir neçə variant üçün "es5 shim" i tapmaq).

forEach , məzmun sahəsindəki indeksləmə və dəyişən dəyərləri bəyan forEach üstünlüyə malikdir, çünki iterasiya funksiyasına arqumentlər kimi təqdim edilir və bu iteratsiyaya yaxşı yönəldilir.

Hər array qeydinə görə funksiya çağırışını yerinə yetirmək üçün lazım olan vaxtdan narahat olmağınızdan asılı olmayın; detallar

Bununla yanaşı, hər üçün "hər birinin içərisində loop" funksiyası var, ancaq ES5 bir sıra digər faydalı funksiyaları "array funksiyaları və şeylər vasitəsilə hazırlamışdır", o cümlədən:

  • every (loop ilk dəfə geri çağırış false və ya yalan bir şey qaytarır)
  • some (loop ilk dəfə geri çağırış true və ya bir şey məqbul qaytarır dayanır)
  • filter (filter funksiyası true döndüyü elementləri ehtiva edən yeni bir array yaradır və false qaytardığı yerləri saxlayır)
  • map (yeni geri qayıtma dəyərləri yaradır)
  • reduce (bir dəyəri artırmaq, geri çağırışı yenidən çağırmaq, əvvəlki dəyərlər keçmək, ətraflı məlumat üçün spesifikasiyaya bax, bir sıra məzmununu toplamaq üçün faydalıdır və s.)
  • reduceRight (məsələn, reduce , lakin artan qaydada azalan qaydada işləyir)

2. Loop for sadə istifadə edin

Bəzən köhnə yollar yaxşıdır:

 var index; var a = ["a", "b", "c"]; for (index = 0; index < a.length; ++index) { console.log(a[index]); } 

Serialın uzunluğu dövründə dəyişməzsə və həssaslıq kodu (ehtimalı) olsa, ön uzunluğu ilə çəkilmənin bir qədər daha mürəkkəb versiyası bir az daha sürətli ola bilər:

 var index, len; var a = ["a", "b", "c"]; for (index = 0, len = a.length; index < len; ++index) { console.log(a[index]); } 

Və / və ya geri sayma:

 var index; var a = ["a", "b", "c"]; for (index = a.length - 1; index >= 0; --index) { console.log(a[index]); } 

Ancaq müasir JavaScript mexanizmləri ilə, bu nadir hallarda bu son meyvə şirəsini çıxarmaq lazımdır.

ES2015 və daha yüksək səviyyədə loops for indeksinizi və dəyər dəyişənlərinizi lokal hala gətirə bilərsiniz:

 let a = ["a", "b", "c"]; for (let index = 0; index < a.length; ++index) { let value = a[index]; } //console.log(index); // Would cause "ReferenceError: index is not defined" //console.log(value); // Would cause "ReferenceError: value is not defined" 

Bunu etdiyiniz zaman, yalnız value deyil, həm də döngənin hər təkrarlanması üçün index , yəni döngə etiketində yaranan bağlamalar bu xüsusi təkrarlama üçün yaradılan index (və value ) istinad verir:

 let divs = document.querySelectorAll("div"); for (let index = 0; index < divs.length; ++index) { divs[index].addEventListener('click', e => { alert("Index is: " + index); }); } 

Əgər siz beş divli olsaydınız, "Index is: 0" əldə edərdiniz, əgər ilkini tıkladığınız və "Index is: 4", sonuncu dəfə tıkladıysanız. Bura istifadə etsəniz, bu istifadə etmir .

3. Düzgün şəkildə istifadə edin.

İnsanları sizdən istifadəyə izah edəcəklər, amma bu for-in . for-in serialın indeksləri deyil, obyektin sayılan xüsusiyyətləri ilə yazılır. Sifariş ES2015 (ES6) da belə təmin edilmir. ES2015 bir obyektin xüsusiyyətlərini təyin edir ( [[OwnPropertyKeys]] , [[Enumerate]]Object.getOwnPropertyKeys kimi istifadə edən şeylərdən istifadə edir), lakin for-in bu qaydaya əməl edəcəkdir. ( Digər cavabda ətraflı .)

Lakin, müvafiq tədbirlərdən istifadə edərkən , xüsusən də sadə dizilər üçün faydalı ola bilər:

 // 'a' is a sparse array var key; var a = []; a[0] = "a"; a[10] = "b"; a[10000] = "c"; for (key in a) { if (a.hasOwnProperty(key)  // These are explained /^0$|^[1-9]\d*$/.test(key)  // and then hidden key <= 4294967294 // away below ) { console.log(a[key]); } } 

İki çekləri qeyd edin:

  1. Obyektin bu adı altında öz mülkiyyətinə malik olması (və onun prototipindən irs olaraq deyil) və

  2. Anahtar, normal dize formunda baz-10 ədədi simli olduğunu və dəyəri <= 2 ^ 32 - 2 (4,294,967,294) təşkil edir. Bu rəqəm nereden gəlir? Bu spesifikasiyada dizi indeksi indeksinin bir hissəsidir. Digər nömrələr (qeyri-tamsayı ədədlər, mənfi ədədlər, 2 ^ 32 - 2-dən yuxarı ədədlər) sıra indeksləri deyildir. 2 ^ 32 - 2 səbəbi length dizinin length maksimum dəyəri olan ən yüksək indeksi dəyərinin 2 ^ 32 - 1- dən az olduğunu length . (Məsələn, dizi uzunluğu 32 bitlik olmayan bir tamsayıya bərabərdir.) (Mənim əvvəlki testimin düzgün olmadığını bildirən blog yazısına şərh etmək üçün RobG-dən bir təsdiq).

Bu, çox dizilişlərdə hər bir döngənin təkrarlanması üçün kiçik bir əlavədir, lakin sadə bir sıra varsa, bu loop üçün daha səmərəli bir yol ola bilər, çünki bu, həqiqətən mövcud olan qeydlər üçün yalnız looplardır. Məsələn, yuxarıdakı sıra üçün üç dəfə loop ( "10" , "10""10000" düymələri xatırlayırıq ki, bunlar xətlərdir) 10,001 dəfə deyil.

İndi hər dəfə yazmaq istəmirsiniz, ona görə də onu alət qutunuza yerləşdirə bilərsiniz:

 function arrayHasOwnIndex(array, prop) { return array.hasOwnProperty(prop)  /^0$|^[1-9]\d*$/.test(prop)  prop <= 4294967294; // 2^32 - 2 } 

Və bundan sonra belə bir şəkildə istifadə edəcəyik:

 for (key in a) { if (arrayHasOwnIndex(a, key)) { console.log(a[key]); } } 

Və ya, yalnız "çox hallarda yaxşı" testi ilə maraqlanırsınızsa, onu istifadə edə bilərsiniz, lakin yaxın olduğu müddətdə bu çox doğru deyil:

 for (key in a) { // "Good enough" for most cases if (String(parseInt(key, 10)) === key  a.hasOwnProperty(key)) { console.log(a[key]); } } 

4. for-of istifadə (örtülü iteratordan istifadə edin) (ES2015 +)

ES2015 iteratorları JavaScript-yə əlavə edir. Yineleyicilərdən istifadə etmək üçün ən asan yol - operator for-of yeni. Belə görünür:

 var val; var a = ["a", "b", "c"]; for (val of a) { console.log(val); } 

Nəticə:

 a b c

Dizidəki yineleyiciyi alır və üzərindən keçən örtüklər altında, dəyərlər alır. Bu, bir obyekt (array) tərəfindən müəyyən edilmiş yineltici istifadə edir və array onların iteratorlarının onların qeydlərini (və onların xüsusiyyətlərini) təkrarladığını təyin etmək for-in istifadə for-in heç bir problem yoxdur. ES5 for-in olduğu kimi fərqli olaraq, qeydlərin görüntülendiği qaydalar onların göstəricilərinin ədədi əmridir.

5. İtatoru açıq şəkildə istifadə edin (ES2015 +)

Bəzən bir iteratordan açıq şəkildə istifadə edə bilərsiniz. Bunu da-edə bilərik, baxmayaraq ki, bu daha çox klunkierdir. Belə görünür:

 var a = ["a", "b", "c"]; var it = a.values(); var entry; while (!(entry = it.next()).done) { console.log(entry.value); } 

Bir iterator spesifikasiyada İteratorın tərifi ilə uyğun gələn bir obyektdir. Onun next üsulu hər dəfə onu çağıranda yeni bir nəticə obyekti qaytarır. Nəticənin obyekti bir əmlaka malikdir, done işin olub-olmadığını və əmlakın dəyəri bu iteration üçün dəyər verdiyini bildirir. (əgər false olarsa, isteğe bağlıdır, value undefined edilmədiyində isteğe bağlıdır).

Qiymət value iteratordan asılı olaraq dəyişir; array dəstək (ən azı) yineleyiciləri qaytarır ki, üç funksiyaları:

  • values() : Bu, yuxarıda istifadə etdiyim bir mənadır. Hər bir value bu iteration üçün yuxarıda göstərilən nümunədə ( "a" , "b""c" ) bir sıra rekord olduğu bir iterator qaytarır.
  • keys() : Hər bir value bu təkrarlama üçün əsas olduğuna görə bir yineleyiciyi qaytarır (yuxarıda bizim a "0" , sonra "1" , sonra "2" ).
  • entries() : hər itin bu iteration üçün [key, value] şəklində bir sıra olduğu yineleyiciyi qaytarır.

Bir sıra kimi obyektlər üçün

Həqiqi NodeList olaraq length xüsusiyyətlərinə və xüsusiyyətlərinə NodeList adları olan NodeList obyektləri də var: NodeList nümunələri, arguments obyekti və s. Biz onların məzmununu NodeList edə bilərik?

Yuxarıda göstərilən parametrlərdən dizilər üçün istifadə edin.

Ən azı bir sıra, və bəlkə də yuxarıdakı dizilərin əksəriyyəti və ya hətta bir çoxu serial tipli obyektlər üçün də eyni dərəcədə yaxşı istifadə edilir:

  1. Hər biri və əlaqəli (ES5 +) üçün istifadə edin

    Array.prototype üzərindəki müxtəlif funksiyalar "qəsdən ümumi" olur və Function#call Function#apply və ya Function#apply ilə bir sıra kimi obyektlər üçün istifadə edilə Function#apply . (Bu cavabın sonunda qonaq tərəfindən göstərilən obyektlərə baxın, lakin bu nadir bir problemdir.)

    childNodes Node childNodes forEach istifadə etmək childNodes . Bunu edərdin:

     Array.prototype.forEach.call(node.childNodes, function(child) { // Do something with 'child' }); 

    Bunu çox şey edəcəyəmsə, məsələn, bir dəyişəndə ​​funksiyanı referansın bir surətini yenidən əldə etmək istəyə bilərsiniz:

     // (This is all presumably in some scoping function) var forEach = Array.prototype.forEach; // Then later... forEach.call(node.childNodes, function(child) { // Do something with 'child' }); 
  2. Döngə for sadə istifadə edin

    Aydındır ki, bir sıra kimi obyektlərə sadə bir loop tətbiq olunur.

  3. Düzgün şəkildə istifadə edin

    bir array ilə eyni zəmanət ilə for-in , bir sıra oxşar obyektləri ilə işləmək lazımdır; Ev sahibinin yuxarıda göstərilən 1 nömrəli maddələr üçün sifarişlər tələb oluna bilər.

  4. For for-of istifadə (örtülü iteratordan istifadə edin) (ES2015 +)

    for-of object obyektin verdiyi iteratordan istifadə edəcəkdir (əgər varsa); bu xüsusilə host faylları ilə müxtəlif serial kimi obyektlərlə necə baş verdiyini görmək məcburiyyətində qalacağıq. Məsələn, NodeList üçün spesifikasiya yinelemeyi dəstəkləmək üçün yeniləndi. HTMLCollection ın getElementsByTagName üçün dəqiqləşdirilməsi getElementsByTagName .

  5. Iteratordan açıq şəkildə istifadə edin (ES2015 +)

    4 sayına baxın, təkrarlananların necə açıldığını görmək lazımdır.

Həqiqi bir sıra yaradın

Digər hallarda, bir cisim kimi bir obyekti əsl bir araya çevirə bilərsiniz. Bunun üçün təəccüblü asandır:

  1. slice sıra üsulundan istifadə edin

    Yuxarıda göstərilən digər üsullar kimi "qəsdən ümumi" olduğu və beləliklə, dizi kimi obyektlərlə istifadə edilə bilən slice array üsulundan istifadə edə bilərik, məsələn:

     var trueArray = Array.prototype.slice.call(arrayLikeObject); 

    Beləliklə, məsələn, bir NodeList gerçək bir NodeList çevirmək istəyiriksə, bunu edə bilərik:

     var divs = Array.prototype.slice.call(document.querySelectorAll("div")); 

    Aşağıda "Host-təmin edilmiş obyektlər üçün Diqqət" bölməsinə baxın. Xüsusilə qeyd edək ki, bu, IE8-də və daha əvvəl işləməyəcək və this , ev sahibi tərəfindən təmin edilən obyektlərin istifadəsinə imkan vermir.

  2. Dağıtım sözdizimini istifadə edin ( ... )

    ES2015 distribution sintaksisini bu funksiyanı dəstəkləyən JavaScript mexanizmləri ilə də istifadə etmək mümkündür:

     var trueArray = [...iterableObject]; 

    Beləliklə, məsələn, bir NodeList gerçək bir NodeList çevirmək istəyiriksə, yayılma sintaksisi ilə olduqca qısa olur:

     var divs = [...document.querySelectorAll("div")]; 
  3. Array.from (spec) | istifadə edin (MDN)

    Array.from (ES2015 +, lakin asanlıqla poly dolu) bir obyekt kimi bir obyektdən bir sıra yaradır, zəruri hallarda əvvəlcə uyğun funksiyadan keçən qeydləri verir. Beləliklə:

     var divs = Array.from(document.querySelectorAll("div")); 

    Və ya, müəyyən bir sinif elementləri üçün etiket adları bir sıra almaq istəyirsinizsə, Xəritəçəkmə funksiyasından istifadə etməlisiniz:

     // Arrow function (ES2015): var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName); // Standard function (since 'Array.from' can be shimmed): var divs = Array.from(document.querySelectorAll(".some-class"), function(element) { return element.tagName; }); 

Ev sahibi tərəfindən təmin edilən imkanlar üçün xəbərdarlıq

Array.prototype funksiyasını hostlar kimi obyektlərlə (DOM siyahıları və JavaScript mühərriki deyil, brauzer tərəfindən verilən digər şeylər) istifadə edirsinizsə, təmin edilən host obyektinin davranışını təmin etmək üçün hədəf mühitlərdə test Array.prototype əmin olmalısınız düzgündür. Onların əksəriyyəti düzgün davranır (indi), amma yoxlamaq vacibdir. Bunun səbəbi, ehtimal ki, istifadə etmək istədikləri Array.prototype metodlarının əksəriyyəti, [[HasProperty]] dürüst cavab verən host tərəfindən verilən obyektə əsaslanır. Bu yazı zamanı brauzerlər çox yaxşı bir iş gördülər, ancaq 5.1 spesifikasiyası ev sahibi tərəfindən verilən obyektin ədalətli ola bilməyəcəyini irəli sürdü. Bu, §8.6.2-də , bu hissənin əvvəlində böyük masanın altındakı bir neçə bənddədir , burada deyilir:

Başqa cür qeyd edilmədiyi halda ana obyektlər hər hansı bir şəkildə bu daxili üsulları həyata keçirə bilər; məsələn, bir ehtimal ki, müəyyən bir ana obyekt üçün [[Get]][[Put]] əmlak dəyərlərini həqiqətən almaq və saxlamaq, lakin [[HasProperty]] həmişə yanlışlıq yaradır.

(ES2015 spesifikasiyasında ekvivalent ifadələr tapa bilmədi, amma yenə də olmalıdır). Yenə də, [[ NodeList nümunələri, məsələn) müasir brauzerlərdə verilən obyekt növündən ümumi bir NodeList [[HasProperty]] düzgün [[HasProperty]] , lakin vacibdir yoxlayın.)

6292
17 февр. Cavab TJ Crowder tərəfindən verildi 17 fevral. 2012-02-17 16:53 '12 at 4:53 pm 2012-02-17 16:53

Düzenle : bu cavab ümidsiz bir şəkildə köhnəlmişdir. Daha müasir bir yanaşma üçün, array mövcud üsullara baxın. Maraq metodları ola bilər:

  • hər biri üçün
  • kartı
  • filtrdir
  • fermuar sürgüsü
  • azaltmaq
  • hər
  • bir az

JavaScript-də bir sıra yineleme üçün standart yol, vanilya aiddir:

border=0
 var length = arr.length, element = null; for (var i = 0; i < length; i++) { element = arr[i]; // Do something with element } 

Buna baxmayaraq, bu yanaşma yalnız yoğun bir sıra varsa və hər bir indeks bir element tərəfindən işğal olunarsa yaxşıdır. Serialın az olması halında, bu yanaşma ilə performans problemləri ola bilər, çünki həqiqətən dizidəki mövcud olmayan bir çox göstəricidən keçəcəksiniz. Bu vəziyyətdə, istifadə for.. in daha yaxşıdır. Bununla belə, serialın yalnız tələb olunan xüsusiyyətləri (məsələn, elementlərin elementləri) fəaliyyət göstərməsini təmin etmək üçün müvafiq tədbirlərdən istifadə etməlisiniz, çünki for..in for-loop da köhnə brauzerlərdə siyahıya alınacaq və ya əlavə xüsusiyyətlər enumerable kimi enumerable edildikdə.

ECMAScript 5 -də, forEach üsulu dizi prototipi üçün istifadə olunacaq, lakin bu, köhnə brauzerlərdə dəstəklənmir. Buna görə də, onu ardıcıl olaraq istifadə etmək üçün ya onu dəstəkləyən bir mühit olmalıdır (məsələn, server-side JavaScript üçün Node.js ) və ya "Polyfill" istifadə edin. Bununla yanaşı, bu funksionallıq üçün Polyfill çox əhəmiyyətsizdir və kodun oxunmasını asanlaşdırdığından Polyfill-a daxil edilməlidir.

470
17 февр. 17 fevralda PatrikAkrstrand tərəfindən verilmiş cavab. 2012-02-17 16:55 '12 at 4:55 pm 2012-02-17 16:55

JQuery kitabxanasını istifadə edirsinizsə, jQuery.each istifadə edə bilərsiniz:

 var length = yourArray.length; for (var i = 0; i < length; i++) { // Do something with yourArray[i]. } 
214
17 февр. Cavab 17 fevralda verilir. 2012-02-17 17:01 '12 at 17:01 2012-02-17 17:01

Geri çəkin

Hesab edirəm ki, dövr üçün tərs bir sözə layiqdir:

 for (var i = array.length; i--; ) { // process array[i] } 

Faydaları:

  • Siz müvəqqəti dəyişən len elan array.length və ya hər iteration zamanı array.length ilə müqayisə array.length , bu dəqiqə optimallaşdırma ola bilər.
  • DOM'dan qardaşların tərs qaydada çıxarılması adətən daha səmərəlidir . (Brauzer daxili elementlərdə daha az elementi hərəkət etməlidir.)
  • Bir döngə dövründə, bir dizindəki və ya sonra bir dizi dəyişirsinizsə (məsələn, silmək və ya bir elementi array[i] ) yerləşdirirsinizsə, birbaşa loop sola kaydırılan elementi atar və ya keçmiş i-ci elementi yenidən yoxlayır sağa doğru. Ənənəvi döngədə, işlənməlisiniz ki, növbəti elementə işarə etmək i i yeniləyə bilər - 1, lakin təkrarlanma istiqamətini dəyişmək çox vaxt daha sadədaha zərif bir həlldir .
  • Eynilə, daxili DOM elementlərini dəyişdirərkən və ya sildikdə, tərs işləmə səhvlər atlaya bilər . Məsələn, uşaqlarını işləmədən əvvəl ana node innerHTML dəyişdirin. Uşaq node çatdıqda, valideyn innerHTML yazıldığı zaman onu yeni bir nəsil ilə əvəz edən DOM'dan ayrılır.
  • daha qısa və mövcud digər variantlardan daha çox oxumaq . Baxmayaraq ki, for Each forEach() və ES6 for ... of itirir.

Dezavantajları:

  • Məhsullar tərs qaydada işləyir. Yeni bir sıra nəticələr və ya ekranda yazılmış olsanız, çıxış, əlbəttə, orijinal qaydaya görə ləğv olunacaq .
  • Неоднократно вставляя братьев и сестер в DOM в качестве первого ребенка, чтобы сохранить их порядок, менее эффективен . (В браузере все равно придется перекладывать вещи.) Чтобы создавать узлы DOM эффективно и упорядоченно, просто переходите вперед и добавьте как обычно (а также используйте "фрагмент документа" ).
  • Обратный цикл запутывает для младших разработчиков. (Вы можете считать это преимущество, в зависимости от вашего прогноза.)

Должен ли я всегда использовать его?

Некоторые разработчики используют обратный цикл для по умолчанию, если нет веской причины для перехода вперед.

Хотя прирост производительности обычно незначителен, это крики:

"Просто сделайте это для каждого элемента в списке, я не забочусь о заказе!"

Однако на практике это не на самом деле надежное указание на намерение, поскольку оно неотличимо от тех случаев, когда вы делаем заботиться о заказе и действительно выполняете нужна для обратной петли. Таким образом, на самом деле потребуется еще одна конструкция, чтобы точно выразить намерение "не заботиться", что в настоящее время недоступно на большинстве языков, включая ECMAScript, но которое можно назвать, например, forEachUnordered() .

Если порядок не имеет значения, а эффективность вызывает озабоченность (в самом внутреннем цикле движка игры или анимации), тогда может быть приемлемым использовать цикл обратного цикла, к рисунку. Просто помните, что просмотр обратного цикла в существующем коде не обязательно означает , что порядок не имеет значения!

Лучше использовать forEach()

В целом для кода более высокого уровня, где ясность и безопасность больше беспокоят, я бы рекомендовал использовать Array::forEach как ваш шаблон по умолчанию:

  • Ясно читать.
  • Это означает, что я не будет перемещаться внутри блока (что всегда является возможным сюрпризом, скрывающимся в длинных циклах for и while .)
  • Это дает вам свободу действий для закрытия.
  • Это уменьшает утечку локальных переменных и случайное столкновение с (и мутацией) внешних переменных.

Затем, когда вы видите обратное для цикла в своем коде, это намек на то, что он поменялся по уважительной причине (возможно, одна из причин, описанных выше). И, увидев традиционный цикл вперед, можно указать, что может произойти переключение.

(Если обсуждение намерения не имеет для вас никакого смысла, то вам и вашему коду может быть полезно посмотреть лекцию Крокфорда на Стиль программирования и ваш мозг .)


Necə işləyir?

 for (var i = 0; i < array.length; i++) { ... } // Forwards for (var i = array.length; i--; ) { ... } // Reverse 

Вы заметите, что i-- является средним предложением (где мы обычно видим сравнение), а последнее предложение пусто (где мы обычно видим i++ ). Это означает, что i-- также используется как условие продолжения. Реально, он выполняется и проверяется перед каждой итерацией.

  • Как он может начинаться с array.length без взрыва?

    Поскольку i-- запускается перед каждой итерацией, на первой итерации мы фактически получаем доступ к элементу в array.length - 1 , который избегает любых проблем с элементами Array-out-of-bounds undefined .

  • Почему он не останавливает итерацию перед индексом 0?

    Цикл прекратит итерацию, когда условие i-- оценивает значение false (когда оно дает 0).

    Фокус в том, что в отличие от --i , конечный оператор i-- уменьшает i , но дает значение до декремента. Ваша консоль может продемонстрировать это:

    > var i = 5; [i, i--, i];

    [5, 5, 4]

    Итак, на последней итерации я ранее был 1 , а выражение i-- меняло его на 0 , но на самом деле дает 1 (правдиво), и поэтому условие проходит. На следующей итерации i-- меняет я на -1 , но дает 0 (falsey), заставляя выполнение немедленно выходить из нижней части цикла.

    В традиционном forwards for loop, i++ и ++i взаимозаменяемы (как указывает Дуглас Крокфорд). Однако в обратном для цикла, поскольку наш декремент также является выражением нашего условия, мы должны придерживаться i-- , если мы хотим обработать элемент в индексе 0.


Пустяки

Некоторым людям нравится рисовать небольшую стрелку в обратном цикле for и заканчивать миганием:

 for (var i = array.length; i --> 0 ;) { 

Кредиты идут в WYL, чтобы показать мне преимущества и ужасы обратного цикла.

94
ответ дан joeytwiddle 02 мая '14 в 17:21 2014-05-02 17:21

Некоторые C -язычные языки используют foreach для циклического перебора. В JavaScript это делается с помощью структуры for..in :

 var index, value; for (index in obj) { value = obj[index]; } 

Есть улов. for..in будет проходить через каждый из перечисляемых объектов и членов на его прототипе. Чтобы избежать считывания значений, которые наследуются через прототип объекта, просто проверьте, принадлежит ли свойство объекту:

 for (i in obj) { if (obj.hasOwnProperty(i)) { //do stuff } } 

Кроме того, ECMAScript 5 добавил foreach to Array.prototype , который может использоваться для перечисления по массиву с использованием calback (polyfill находится в документах, поэтому вы можете использовать его для более старых браузеров):

 arr.forEach(function (val, index, theArray) { //do stuff }); 

Важно отметить, что Array.prototype.forEach не прерывается, когда обратный вызов возвращает false . jQuery и Underscore.js предоставляют свои собственные варианты each , чтобы обеспечить петли, которые могут быть закорочены.

75
ответ дан zzzzBov 17 февр. '12 в 17:00 2012-02-17 17:00

Если вы хотите перебрать массив, используйте стандартный трехчастный цикл for .

 for (var i = 0; i < myArray.length; i++) { var arrayItem = myArray[i]; } 

Вы можете получить некоторую оптимизацию производительности путем кэширования myArray.length или повторения ее назад.

34
ответ дан Quentin 17 февр. '12 в 16:55 2012-02-17 16:55

Я знаю, что это старый пост, и есть много замечательных @. Для немного более полноты я решил, что я бы выбрал другой, используя AngularJS . Конечно, это применимо только в том случае, если вы используете Angular, очевидно, тем не менее, я все равно хочу его поместить.

angular.forEach принимает 2 аргумента и необязательный третий аргумент. Первый аргумент - это объект (массив) для итерации, второй аргумент - функция итератора, а необязательный третий аргумент - это контекст объекта (в основном называемый внутри цикла как 'this'.

Существуют разные способы использования цикла forEach для angular. Самый простой и, вероятно, наиболее используемый -

 var temp = [1, 2, 3]; angular.forEach(temp, function(item) { //item will be each element in the array //do something }); 

Другой способ, который полезен для копирования элементов из одного массива в другой, -

 var temp = [1, 2, 3]; var temp2 = []; angular.forEach(temp, function(item) { this.push(item); //"this" refers to the array passed into the optional third parameter so, in this case, temp2. }, temp2); 

Хотя вам не обязательно это делать, вы можете просто сделать следующее и это эквивалентно предыдущему примеру:

 angular.forEach(temp, function(item) { temp2.push(item); }); 

Теперь есть плюсы и минусы использования функции angular.forEach , в отличие от встроенного в ванили ароматизированного цикла for .

Pros

  • Легкая читаемость
  • Легкая возможность записи
  • Если доступно, angular.forEach будет использовать цикл ES5 forEach. Теперь я получу эффективность в разделе cons, поскольку петли forEach намного медленнее, чем циклы for. Я упоминаю об этом как о профессионале, потому что приятно быть последовательным и стандартизованным.

Рассмотрим следующие два вложенных цикла, которые делают то же самое. Скажем, что у нас есть 2 массива объектов, и каждый объект содержит массив результатов, каждый из которых имеет свойство Value, которое содержит строку (или что-то еще). И пусть говорят, что нам нужно перебирать каждый из результатов, и если они равны, то выполните какое-то действие:

 angular.forEach(obj1.results, function(result1) { angular.forEach(obj2.results, function(result2) { if (result1.Value === result2.Value) { //do something } }); }); //exact same with a for loop for (var i = 0; i < obj1.results.length; i++) { for (var j = 0; j < obj2.results.length; j++) { if (obj1.results[i].Value === obj2.results[j].Value) { //do something } } } 

Конечно, это очень простой гипотетический пример, но я написал тройку, встроенную для циклов, используя второй подход, и было очень трудно читать и писать по этому поводу.

против

  • Эффективность. angular.forEach , и нативный forEach , если на то пошло, настолько медленнее, чем обычный цикл for .... о на 90% медленнее . Поэтому для больших наборов данных лучше всего придерживаться встроенного цикла for .
  • Нет поддержки перерыва, продолжения или возврата. continue на самом деле поддерживается авария ", чтобы продолжить в angular.forEach , вы просто положили оператор return; в функцию типа angular.forEach(array, function(item) { if (someConditionIsTrue) return; }); , который приведет к тому, что он продолжит работу для этой итерации. Это также связано с тем, что нативный forEach не поддерживает разрыв или продолжается либо.

Я уверен, что есть и другие плюсы и минусы, и, пожалуйста, не стесняйтесь добавлять все, что сочтете нужным. Я чувствую, что в нижней строке, если вам нужна эффективность, придерживайтесь только собственного цикла for для ваших нужд цикла. Но, если ваши наборы данных меньше, и некоторая эффективность в порядке, чтобы отказаться от обмена на удобочитаемость и возможность записи, то непременно бросьте angular.forEach на этого плохого мальчика.

27
ответ дан user2359695 21 июня '14 в 1:56 2014-06-21 01:56

A forEach ( см. в jsFiddle ):

 function forEach(list,callback) { var length = list.length; for (var n = 0; n < length; n++) { callback.call(list[n]); } } var myArray = ['hello','world']; forEach( myArray, function(){ alert(this); // do something } ); 
27
ответ дан nmoliveira 10 апр. '13 в 3:26 2013-04-10 03:26

Если вы не против опустошения массива:

 var x; while(x = y.pop()){ alert(x); //do something } 

x будет содержать последнее значение y , и оно будет удалено из массива. Вы также можете использовать shift() , который даст и удалит первый элемент из y .

27
ответ дан gaby de wilde 10 марта '13 в 5:37 2013-03-10 05:37

Легким решением теперь будет использование библиотеки underscore.js . Он предоставляет множество полезных инструментов, таких как each и автоматически делегирует задание на нативный forEach , если он доступен.

Пример CodePen о том, как он работает:

 var arr = ["elemA", "elemB", "elemC"]; _.each(arr, function(elem, index, ar) { ... }); 

Həmçinin baxın

25
ответ дан Micka 17 июля '13 в 12:07 2013-07-17 12:07

В jQuery существует три реализации foreach следующим образом.

 var a = [3,2]; $(a).each(function(){console.log(this.valueOf())}); //Method 1 $.each(a, function(){console.log(this.valueOf())}); //Method 2 $.each($(a), function(){console.log(this.valueOf())}); //Method 3 
23
ответ дан Rajesh Paul 25 дек. '13 в 19:14 2013-12-25 19:14

Вероятно, цикл for(i = 0; i < array.length; i++) не лучший выбор. Niyə? Если у вас есть это:

 var array = new Array(); array[1] = "Hello"; array[7] = "World"; array[11] = "!"; 

Метод вызовет от array[0] до array[2] . Во-первых, это сначала будет ссылаться на переменные, которых у вас даже нет, во-вторых, у вас не будет переменных в массиве, а в-третьих, это сделает код более смелым. Послушайте, это то, что я использую:

 for(var i in array){ var el = array[i]; //If you want 'i' to be INT just put parseInt(i) //Do something with el } 

И если вы хотите, чтобы это была функция, вы можете сделать это:

 function foreach(array, call){ for(var i in array){ call(array[i]); } } 

Если вы хотите сломать, немного логичнее:

 function foreach(array, call){ for(var i in array){ if(call(array[i]) == false){ break; } } } 

Məsələn:

 foreach(array, function(el){ if(el != "!"){ console.log(el); } else { console.log(el+"!!"); } }); 

Он возвращает:

 //Hello //World //!!! 
22
ответ дан Federico Piragua 02 нояб. '13 в 5:23 2013-11-02 05:23

Как и ES6:

21
ответ дан Zaz 26 мая '16 в 19:14 2016-05-26 19:14

Для for each цикла в родном JavaScript нет ни одного. Вы можете использовать библиотеки, чтобы получить эту функцию (я рекомендую Underscore.js ), используйте простой for в цикле.

 for (var instance in objects) { ... } 

Тем не менее, обратите внимание, что могут быть причины, чтобы использовать еще проще for цикла (см переполнением стека вопрос Почему используется "для... в" с массивом итерационного такой плохой идеей? )

 var instance; for (var i=0; i < objects.length; i++) { var instance = objects[i]; ... } 
17
ответ дан joidegn 17 февр. '12 в 16:58 2012-02-17 16:58

Это итератор для нерезкого списка, где индекс начинается с 0, что является типичным сценарием при работе с document.getElementsByTagName или document.querySelectorAll)

 function each( fn, data ) { if(typeof fn == 'string') eval('fn = function(data, i){' + fn + '}'); for(var i=0, L=this.length; i < L; i++) fn.call( this[i], data, i ); return this; } Array.prototype.each = each; 

Примеры использования:

Пример # 1

 var arr = []; [1, 2, 3].each( function(a){ a.push( this * this}, arr); arr = [1, 4, 9] 

Пример # 2

 each.call(document.getElementsByTagName('p'), "this.className = data;",'blue'); 

Каждый тэг p получает class="blue"

Пример # 3

 each.call(document.getElementsByTagName('p'), "if( i % 2 == 0) this.className = data;", 'red' ); 

Каждый другой тег p получает class="red" >

Пример # 4

 each.call(document.querySelectorAll('p.blue'), function(newClass, i) { if( i < 20 ) this.className = newClass; }, 'green' ); 

И, наконец, первые 20 синих p-тэгов меняются на зеленый

Предостережение при использовании функции string как функции: функция создается вне контекста и должна использоваться только там, где вы уверены в переменном охвате. В противном случае лучше передать функции, где область обзора более интуитивно понятна.

17
ответ дан Tim 30 янв. '14 в 18:25 2014-01-30 18:25

Существует несколько способов циклического преобразования массива в JavaScript, как показано ниже:

для - это самый распространенный. Полный блок кода для циклирования

 <p id="example"></p> 

while - loop, пока выполняется условие. Кажется, это самый быстрый цикл

 <p id="example"></p> 

do/while - также цикл через блок кода, пока условие истинно, будет выполняться как минимум один раз

 <p id="example"></p> 

Функциональные циклы - forEach , map , filter , также reduce (они прокручивают функцию, но используются, если вам нужно что-то делать с вашим массивом и т.д.

 <p id="example"></p> 

Для получения дополнительной информации и примеров о функциональном программировании на массивах, посмотрите на сообщение в блоге. Функциональное программирование в JavaScript: отображение, фильтрация и уменьшение .

16
ответ дан Alireza 10 мая '17 в 17:32 2017-05-10 17:32

ECMAScript5 (версия на Javascript) для работы с массивами.

forEach . Итерирует каждый элемент массива и делает все, что вам нужно, с каждым элементом.

 ['C', 'D', 'E'].forEach(function(element, index) { console.log(element + " is the #" + (index+1) + " in musical scale"); }); // Output // C is the #1 in musical scale // D is the #2 in musical scale // E is the #3 in musical scale 

В случае, более заинтересованный в работе над массивом с использованием некоторой встроенной функции.

map . Он создает новый массив с результатом функции обратного вызова. Этот метод хорош для использования, когда вам нужно отформатировать элементы вашего массива.

 // Let upper case the items in the array ['bob', 'joe', 'jen'].map(function(elem) { return elem.toUpperCase(); }); // Output: ['BOB', 'JOE', 'JEN'] 

уменьшить . Как видно из названия, он уменьшает массив до одного значения, вызывая передачу данной функции в элементе currenct и результате предыдущего выполнения.

 [1,2,3,4].reduce(function(previous, current) { return previous + current; }); // Output: 10 // 1st iteration: previous=1, current=2 => result=3 // 2nd iteration: previous=3, current=3 => result=6 // 3rd iteration: previous=6, current=4 => result=10 

каждый - возвращает true или false, если все элементы массива проходят тест в функции обратного вызова.

 // Check if everybody has 18 years old of more. var ages = [30, 43, 18, 5]; ages.every(function(elem) { return elem >= 18; }); // Output: false 

фильтр - очень похоже на каждый, кроме того, что фильтр возвращает массив с элементами, возвращающими true для данной функции.

 // Finding the even numbers [1,2,3,4,5,6].filter(function(elem){ return (elem % 2 == 0) }); // Output: [2,4,6] 

Надеюсь, это будет полезно.

14
ответ дан Anil Kumar Arya 09 апр. '17 в 19:51 2017-04-09 19:51

Там нет встроенной способности взломать для forEach . Чтобы прервать выполнение, используйте Array#some как показано ниже:

 [1,2,3].some(function(number) { return number === 1; }); 

Это работает, потому что some возвращают true, как только любой из обратных вызовов, выполненный в порядке массива, возвращает true, короткое замыкание выполнения остальных. Оригинальный ответ см. В прототипе Array для некоторых

14
ответ дан Priyanshu Chauhan 27 июля '15 в 10:07 2015-07-27 10:07

Я также хотел бы добавить это как состав обратной петли и ответ выше для тех, кто хотел бы также использовать этот синтаксис.

 var foo = [object,object,object]; for (var i = foo.length, item; item = foo[--i];) { console.log(item); } 

Плюсы:

Выгода для этого: у вас есть ссылка уже в первом, что не нужно будет объявлять позже с другой строкой. Это удобно при циклическом перемещении по массиву объектов.

Минусы:

Это будет прерываться всякий раз, когда ссылка ложна - false (undefined и т.д.). Однако это можно использовать как преимущество. Однако, это сделало бы его немного труднее читать. А также в зависимости от браузера он может быть "не" оптимизирован для работы быстрее оригинального.

11
ответ дан Volkan Seçkin Akbayır 28 авг. '15 в 10:27 2015-08-28 10:27

jQuery, используя $.map :

 var data = [1, 2, 3, 4, 5, 6, 7]; var newData = $.map(data, function(element) { if (element % 2 == 0) { return element; } }); // newData = [2, 4, 6]; 
10
ответ дан DanFromGermany 01 апр. '14 в 14:15 2014-04-01 14:15

Использование циклов с оператором деструктуризации и распространения ES6

Разрушение и использование оператора распространения оказались весьма полезными для новичков в ES6 как более удобочитаемые/эстетичные, хотя некоторые ветераны javascript могут посчитать это грязным, юниоры или некоторые другие люди могут найти его полезным.

Следующие примеры будут использовать for...of оператора и метода .forEach .

Примеры 6, 7 и 8 могут использоваться с любыми функциональными циклами, такими как .map , .filter , .reduce , .sort , .every , .some , для получения дополнительной информации об этих методах проверьте объект Array .

Пример 1: Нормально for...of цикла - здесь нет хитростей.

 let arrFruits = ['apple', 'orange', 'banana']; for (let [firstLetter, ...restOfTheWord] of arrFruits) { // Create a shallow copy using the spread operator let [lastLetter] = [...restOfTheWord].reverse(); console.log(firstLetter, lastLetter, restOfTheWord); } 

Пример 3: Цикл с key и value

 let arrWithObjects = [{ name: 'Jon', age: 32 }, { name: 'Elise', age: 33 } ]; for (let { name, age: aliasForAge } of arrWithObjects) { console.log(name, aliasForAge); } 

Пример 5: Получить глубокие свойства объекта того, что вам нужно

 let arrWithIndex = [ [0, 'a'], [1, 'b'], [2, 'c'], ]; // Not to be confused here, 'forEachIndex' is the real index // 'mappedIndex' was created by "another user", so you can't really trust it arrWithIndex.forEach(([mappedIndex, item], forEachIndex) => { console.log(forEachIndex, mappedIndex, item); }); 

Пример 7: Используется ли пример 4 с .forEach

 let arrWithObjectsWithArr = [{ name: 'Jon', age: 32, tags: ['driver', 'chef', 'jogger'] }, { name: 'Elise', age: 33, tags: ['best chef', 'singer', 'dancer'] } ]; arrWithObjectsWithArr.forEach(({ name, tags: [firstItemFromTags, ...restOfTags] }) => { console.log(name, firstItemFromTags, restOfTags); }); 
6
ответ дан darklightcode 09 окт. '18 в 23:19 2018-10-09 23:19

Ближе всего к вашей идее будет использовать Array.forEach() , который принимает функцию clojure, которая будет выполнена для каждого элемента массива.

 myArray.forEach( (item) => { // do something console.log(item); } ); 

Другим жизнеспособным способом было бы использовать Array.map() , который работает одинаково, но также и mutates каждый элемент и возвращает его так:

 var myArray = [1, 2, 3]; myArray = myArray.map( (item) => { return item + 1; } ); console.log(myArray); // [2, 3, 4] 
6
ответ дан Ante Jablan Adamović 09 нояб. '17 в 18:31 2017-11-09 18:31

Синтаксис лямбда обычно не работает в IE 10 или ниже.

Обычно я использую

 [].forEach.call(arrayName,function(value,index){ console.log("value of the looped element" + value); console.log("index of the looped element" + index); }); If you are a jQuery Fan and already have a jQuery file running, you should reverse the positions of the index and value parameters $("#ul>li").each(function(**index,value**){ console.log("value of the looped element" + value); console.log("index of the looped element" + index); }); 
5
ответ дан Murtuza Husain 11 нояб. '17 в 9:16 2017-11-11 09:16

Вы можете вызвать forEach Как это:

 let Array = [1,3,2]; theArray.forEach((element)=>{ // use the element of the array console.log(element) } 

элемент будет иметь значение каждого индекса от 0 до длины массива.

Nəticə:

 1 3 2 

Explaination:

forEach находится в классе прототипов. вы также можете назвать это какArray.prototype.forEach(...);

прототип: https://hackernoon.com/prototypes-in-javascript-5bba2990e04b

Вы также можете изменить массив таким образом:

 for(let i=0;i<theArray.length;i++){ console.log(i); //i will have the value of each index } 
4
ответ дан Nouman Dilshad 17 июля '18 в 15:30 2018-07-17 15:30

Резюме:

При повторении массива мы часто можем достичь одной из следующих целей:

  1. Мы хотим перебрать массив и создать новый массив:

    Array.prototype.map

  2. Мы хотим перебрать массив и не создавать новый массив:

    Array.prototype.forEach

    for..of циклы

В JS существует множество способов достижения обеих этих целей. Однако некоторые из них более примитивны, чем другие. Ниже вы можете найти некоторые общепринятые методы (наиболее удобные imo) для выполнения итерации массива в javascript.

Создание нового массива: Map

map() - это функция, расположенная на Array.prototype которая может преобразовывать каждый элемент массива и затем возвращает новый массив. map() принимает в качестве аргумента функцию обратного вызова и работает следующим образом:

 let arr = [1, 2, 3, 4, 5]; arr.forEach((element, index, array) => { console.log(element * 2); if (index === 4) { console.log(array) } // index, and oldArray are provided as 2nd and 3th argument by the callback }) console.log(arr); 

Точно так же, как функция map , обратный вызов forEach предоставляет в качестве второго аргумента номер индекса текущей итерации. Также третий аргумент предоставляет массив, на который был вызван forEach .

for..of элементы, используя

Цикл for..of циклы через каждый элемент массива (или любой другой итерируемый объект). Он работает следующим образом:

 let arr = [1, 2, 3, 4, 5]; arr.foo = 'foo'; for(let element of arr) { console.log(element); } for(let element in arr) { console.log(element); } 
2
ответ дан Willem van der Veen 08 сент. '18 в 10:55 2018-09-08 10:55
 var a = ["car", "bus", "truck"] a.forEach(function(item, index) { console.log("Index" + index); console.log("Element" + item); }) 
1
ответ дан John 11 янв. '18 в 21:03 2018-01-11 21:03

Если у вас массивный массив, вы должны использовать iterators чтобы получить некоторую эффективность. Итераторы являются свойством некоторых сборников JavaScript (таких как Map , Set , String , Array ). Даже для for..of использования iterator под капотом.

Итераторы повышают эффективность, позволяя вам потреблять элементы в списке по одному, как если бы они были потоком. Что делает специальный итератор особенным, так это то, как он перемещается по коллекции. Другие циклы должны загружать всю коллекцию спереди, чтобы перебирать ее, тогда как итератору нужно знать только текущую позицию в коллекции.

Вы получаете доступ к текущему элементу, вызывая next метод итераторов. Следующий метод вернет value текущего элемента и boolean чтобы указать, когда вы достигли конца коллекции. Ниже приведен пример создания итератора из массива.

Преобразуйте свой обычный массив в итератор, используя метод values() следующим образом:

Symbol.iterator следующим образом: 

iterator следующим образом: 

for..in в этом случае, потому что вместо значений он работает с ключами. 

Вы можете прочитать больше о iteration protocol здесь .

1
ответ дан BlackBeard 06 июля '18 в 10:11 2018-07-06 10:11

Если вы хотите сохранить функциональность своего кода, используйте map:

 theArray.map(instance => do_something); 

Таким образом, вы создадите новый массив для будущей работы и пропустите любой нежелательный побочный эффект.

0
ответ дан alejoko 02 февр. '19 в 18:13 2019-02-02 18:13

Если вы хотите использовать forEach() , это будет выглядеть так -

 theArray.forEach ( element => { console.log(element); }); 

Если вы хотите использовать for() , это будет выглядеть как -

 for(let idx = 0; idx < theArray.length; idx++){ let element = theArray[idx]; console.log(element); } 
0
ответ дан Harunur Rashid 30 мая '18 в 12:05 2018-05-30 12:05

Я пришел с питона, и я нашел этот путь намного яснее.
theArray - массив, экземпляр - элемент массива.

 for(let instance of theArray) { console.log("The instance",instance); } 

və ya

 for( instance in theArray) { console.log("The instance",instance); } 

сравнить с:

 theArray.forEach(function(instance) { console.log(instance); }); 

но в конце дня оба делают одно и то же

0
ответ дан Peko Chan 12 дек. '18 в 14:06 2018-12-12 14:06
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос