Я думаю, кожен постачальник повинен реалізувати це відповідно до специфікації
Фактична реалізація, наприклад V8, може бути трохи складною, зверніться до цієї відповіді для початку . Ви також можете посилатись на джерело v8 в github, але це може бути не просто зрозуміти окремо лише одну частину.
Цитуємо зверху відповідь:
Тут розробник V8. У нас є кілька різних методів реалізації "вбудованих": деякі написані на C ++, деякі в Torque, деякі в тому, що ми називаємо CodeStubAssembler, а деякі безпосередньо в зборі. У попередніх версіях V8 деякі реалізовувалися в JavaScript. Кожна з цих стратегій має свої сильні сторони (витримка складності коду, налагодження, продуктивність у різних ситуаціях, бінарний розмір та споживання пам'яті); плюс завжди є історична причина того, що код розвивався з часом.
Специфікація ES2015:
- Нехай O - ToObject ( це значення).
- ReturnIfAbrupt ( O ).
- Нехай len буде ToLength (Get ( O ,
"length"
)).
- ReturnIfAbrupt ( len ).
- Якщо IsCallable ( callbackfn ) помилковий , киньте виняток TypeError .
- Якщо цей Arg був поставлений, нехай T буде цейArg ; інакше нехай T не визначено .
- Нехай A - ArraySpeciesCreate ( O , len ).
- ReturnIfAbrupt ( A ).
- Нехай k 0.
- Повторіть, поки k < len
- Нехай Pk - ToString ( k ).
- Нехай kPresent буде HasProperty ( O , Pk ).
- ReturnIfAbrupt ( kPresent ).
- Якщо kPresent це правда , то
- Нехай kValue буде Get ( O , Pk ).
- ReturnIfAbrupt ( kValue ).
- Нехай mappedValue буде Call ( callbackfn , T , « kValue , k , O »).
- ReturnIfAbrupt ( картографуєтьсяValue ).
- Нехай статус буде CreateDataPropertyOrThrow ( A , Pk , mappedValue ).
- ReturnIfAbrupt ( статус ).
- Збільшити k на 1.
- Повернення .