Rumah  >  Soal Jawab  >  teks badan

Bagaimanakah fungsi tertib tinggi seperti .map() berfungsi dalam JavaScript?

<p>Pada masa kini semua orang cuba menggunakan fungsi tertib tinggi ini untuk mendapatkan hasil yang menjanjikan dengan menulis kod yang lebih sedikit. Tetapi saya ingin tahu bagaimana fungsi ini berfungsi secara dalaman. </p> <p>Andaikan saya menulis sesuatu yang serupa</p> <p> <pre class="brush:js;toolbar:false;">var numbers = [16, 25, 36]; var keputusan = numbers.map(Math.sqrt); console.log(hasil); // [4, 5, 6]</pre> </p> <p>Saya tahu bahawa setiap elemen tatasusunan "nombor" diulang satu demi satu, tetapi <em>bagaimana</em>? </p> <p>Saya cuba mencarinya tetapi masih belum mendapat jawapan yang memuaskan. </p>
P粉107772015P粉107772015422 hari yang lalu408

membalas semua(2)saya akan balas

  • P粉505450505

    P粉5054505052023-08-26 14:30:37

    Saya rasa setiap pembekal harus mengikut Spesifikasi

    Pelaksanaan sebenar (cth. V8) boleh menjadi agak rumit, lihat jawapan ini sebagai permulaan. Anda juga boleh merujuk kepada kod sumber v8 dalam github, tetapi mungkin tidak mudah untuk memahami sebahagian daripadanya secara berasingan.

    Memetik jawapan di atas:

    Spesifikasi ES2015:

    1. Biar O menjadi ToObject(nilai ini).
    2. ReturnIfAbrupt(O).
    3. Biar len menjadi ToLength(Dapatkan(O, "length")).
    4. ReturnIfAbrupt(len).
    5. Jika IsCallable(callbackfn) adalah false, pengecualian TypeError akan dilemparkan.
    6. Jika Arg ini disediakan, biarkan T menjadi Arg ini; sebaliknya biarkan T tidak ditentukan.
    7. Biar A menjadi ArraySpeciesCreate(O, len).
    8. ReturnIfAbrupt(A).
    9. Biar k menjadi 0.
    10. Ulang sementara k < < len
      1. Biar Pk menjadi ToString(k).
      2. Biar kPresent menjadi HasProperty(O, Pk).
      3. ReturnIfAbrupt(kPresent).
      4. Jika kPresent adalah benar, maka
        1. Biar kValue menjadi Get(O, Pk).
        2. ReturnIfAbrupt(kValue).
        3. Biar MappedValue menjadi Panggilan(callbackfn, T, «kValue, k >, atau ».
        4. ReturnIfAbrupt(mappedValue).
        5. Biar Nyatakan menjadi CreateDataPropertyOrThrow(A, Pk, mappedValue).
        6. ReturnIfAbrupt(status).
      5. Tingkatkan k sebanyak 1.
    11. Kembali ke A.

    balas
    0
  • P粉333395496

    P粉3333954962023-08-26 09:51:45

    .map Hanya kaedah yang menerima panggilan balik, memanggil panggilan balik untuk setiap item tatasusunan dan memberikan nilai kepada tatasusunan baharu. Ia tidak istimewa. Anda juga boleh melakukannya sendiri dengan mudah:

    Array.prototype.myMap = function(callback) {
      const newArr = [];
      for (let i = 0; i < this.length; i++) {
        newArr.push(callback(this[i], i, this));
      }
      return newArr;
    }
    
    var numbers = [16, 25, 36];
    var results = numbers.myMap(Math.sqrt);
    console.log(results); // [4, 5, 6]

    balas
    0
  • Batalbalas