.Map () gibi daha üst düzey işlevler JavaScript'te dahili olarak nasıl çalışır?


17

Günümüzde herkes daha az kod yazarak umut verici sonuçlar elde etmek için bu tür üst düzey işlevleri kullanmaya çalışıyor. Ancak bu işlevlerin dahili olarak nasıl çalıştığını merak ediyorum.

Diyelim ki böyle bir şey yazarsam

var numbers = [16, 25, 36];
var results = numbers.map(Math.sqrt);
console.log(results); // [4, 5, 6]

'Number' dizisinin her öğesinin tek tek yinelendiğini biliyorum, ama nasıl ?

Aramaya çalıştım ama henüz tatmin edici bir cevap alamadım.


10
Array.map'in polifiline bir göz atın
AZ_

mapArray türüne eklenen denilen bir işlevdir . Bu işlev, daha sonra dizi boyunca döngü sırasında çağrılan bir parametre olarak bir işlevi alır. İşlev çağrılarının dönüş değerleri bir dizide döndürülür.
ssc-hrep3

Harita temel olarak diziyi yinelemek için foreach gibi çalışır, dizinin tüm öğelerini tek tek alacağı ve ardından verilen komutu / işlemi her öğeye uygulayacağı ve yeni diziye iteceği anlamına gelir.
Adnan Tarık

Yanıtlar:


23

.mapyalnızca geri aramayı kabul eden, dizinin her öğesi için geri aramayı başlatan ve değeri yeni bir diziye atayan bir yöntemdir. Bu konuda çok özel bir şey yok. Hatta kendiniz bile kolayca uygulayabilirsiniz:

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]

Tamamen spec uyumlu olmak için, ediyorum da ihtiyaç olduğunu, diğer şeyler arasında, kontrol etmek thisbir nesne yani, callbackçağrılabilir ve hiç .callgeçirilen ikinci parametre ile callback'inde myMapvarsa, ancak bu ayrıntılar değil daha üst düzey fonksiyonları anlamak için önemlidir.


8
Bu bana başka cevapları hatırlatıyor …
Bergi

7

Sanırım her satıcı bunu göre uygulamak gerekiyordu şartnameye

Gerçek uygulama, örneğin V8 biraz karmaşık olabilir, bakın bir başlangıç ​​için bu cevaba . Ayrıca github'da v8 kaynağına başvurabilirsiniz, ancak izolasyonda sadece bir parçayı anlamak kolay olmayabilir.

Yukarıdaki cevaptan alıntı:

V8 geliştiricisi burada. "Builtins" için birkaç farklı uygulama tekniğimiz var: bazıları C ++, bazıları Torque, bazıları CodeStubAssembler dediğimiz, bazıları ise doğrudan montajda. V8'in önceki sürümlerinde, bazıları JavaScript ile uygulanmıştı. Bu stratejilerin her birinin kendi güçlü yanları vardır (kod karmaşıklığı, hata ayıklama, çeşitli durumlarda performans, ikili boyut ve bellek tüketimi); artı her zaman kodun zaman içinde gelişmesinin tarihsel nedeni vardır.

ES2015 teknik özellikleri:

  1. Let O (ToObject olmak bu değer).
  2. ReturnIfAbrupt ( O ).
  3. Let len be ToLength (Al ( Ey ,"length" )).
  4. ReturnIfAbrupt ( len ).
  5. IsCallable ( callbackfn ) yanlışsa , TypeError istisnası .
  6. Eğer thisArg sağlandı, let T olmak thisArg ; Başka let T olmak tanımsız .
  7. Let A be ArraySpeciesCreate ( O , len ).
  8. ReturnIfAbrupt ( A ).
  9. İzin Vermek k 0 olur.
  10. Tekrarlayın, k < len
    1. Let Pk (ToString olmak k ) olsun.
    2. KPresent'in HasProperty olmasına izin verin ( O , Pk ).
    3. ReturnIfAbrupt (ReturnIfAbrupt kPresent ).
    4. Eğer kPresent olduğunu doğrudur , sonra
      1. KValue olsun olsun ( O , Pk ).
      2. ReturnIfAbrupt (ReturnIfAbrupt kValue ).
      3. MappedValue Call to ( izin verilen çağrı olsun) ( callbackfn , T , « kValue , k , O »).
      4. ReturnIfAbrupt (ReturnIfAbrupt mappedValue ).
      5. Let durum CreateDataPropertyOrThrow (olmak A , Pk , mappedValue ).
      6. ReturnIfAbrupt ( durum ).
    5. K artır 1 .
  11. İade A .

2
Merak ediyorum, teknik özellikler <li> list-style-typeChrome veya FF'de kopyalanamıyor. Sayıları manuel olarak mı yazdınız yoksa eksik olduğum daha iyi bir yöntem var mı?
CertainPerformance

5
@CertainPerformance lol. HTML'yi kaynaktan, HTML'yi markdown çevrimiçi aracına kopyalayın.
sabithpocker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.