Як функції вищого порядку, такі як .map (), працюють в JavaScript всередині?


17

Кожен сьогодні намагається використовувати такі функції вищого порядку, щоб отримати багатообіцяючий результат, записавши менше коду. Але мені цікаво, як ці функції працюють всередині.

Припустимо, якщо я напишу щось подібне

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

Я знаю, що кожен елемент масиву 'число' повторюється один за одним, але як ?

Я намагався його шукати, але поки не отримав задовільної відповіді.


10
Подивіться на polyfil з Array.map
AZ_

Це функція, що називається, mapяка була додана до типу масиву. Ця функція приймає функцію як параметр, який потім викликається під час циклу проходження масиву. Потім значення повернення функціональних викликів повертаються в масив.
ssc-hrep3

карта в основному працює як foreach для ітерації масиву, означає, що він отримає всі елементи масиву по черзі, а потім застосує дану команду / операцію на кожному елементі, а потім вкаже його в новий масив.
Аднан Тарік

Відповіді:


23

.mapце лише метод, який приймає зворотний виклик, викликає зворотний виклик для кожного елемента масиву і присвоює значення новому масиву. У цьому немає нічого особливого. Ви навіть можете реалізувати його досить легко:

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]

Щоб бути повністю сумісним з технічними характеристиками, вам також потрібно буде перевірити, серед іншого, що thisоб'єкт є, що callbackможна викликати, і .callзворотний виклик з другим параметром, переданим, myMapякщо такий є, але це деталі не важливе для початку розуміння функцій вищого порядку.


8
Це нагадує мені деякі інші відповіді
Бергі

7

Я думаю, кожен постачальник повинен реалізувати це відповідно до специфікації

Фактична реалізація, наприклад V8, може бути трохи складною, зверніться до цієї відповіді для початку . Ви також можете посилатись на джерело v8 в github, але це може бути не просто зрозуміти окремо лише одну частину.

Цитуємо зверху відповідь:

Тут розробник V8. У нас є кілька різних методів реалізації "вбудованих": деякі написані на C ++, деякі в Torque, деякі в тому, що ми називаємо CodeStubAssembler, а деякі безпосередньо в зборі. У попередніх версіях V8 деякі реалізовувалися в JavaScript. Кожна з цих стратегій має свої сильні сторони (витримка складності коду, налагодження, продуктивність у різних ситуаціях, бінарний розмір та споживання пам'яті); плюс завжди є історична причина того, що код розвивався з часом.

Специфікація ES2015:

  1. Нехай O - ToObject ( це значення).
  2. ReturnIfAbrupt ( O ).
  3. Нехай len буде ToLength (Get ( O , "length")).
  4. ReturnIfAbrupt ( len ).
  5. Якщо IsCallable ( callbackfn ) помилковий , киньте виняток TypeError .
  6. Якщо цей Arg був поставлений, нехай T буде цейArg ; інакше нехай T не визначено .
  7. Нехай A - ArraySpeciesCreate ( O , len ).
  8. ReturnIfAbrupt ( A ).
  9. Нехай k 0.
  10. Повторіть, поки k < len
    1. Нехай Pk - ToString ( k ).
    2. Нехай kPresent буде HasProperty ( O , Pk ).
    3. ReturnIfAbrupt ( kPresent ).
    4. Якщо kPresent це правда , то
      1. Нехай kValue буде Get ( O , Pk ).
      2. ReturnIfAbrupt ( kValue ).
      3. Нехай mappedValue буде Call ( callbackfn , T , « kValue , k , O »).
      4. ReturnIfAbrupt ( картографуєтьсяValue ).
      5. Нехай статус буде CreateDataPropertyOrThrow ( A , Pk , mappedValue ).
      6. ReturnIfAbrupt ( статус ).
    5. Збільшити k на 1.
  11. Повернення .

2
Мені цікаво, <li> list-style-typeщо дані не можна скопіювати в Chrome або FF. Ви писали цифри вручну, чи є кращий метод, якого я відсутній?
Окреме виконання

5
@CertainPerformance lol. Скопіюйте HTML з джерела, HTML для розмітки в Інтернеті.
sabithpocker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.