Saya kira setiap vendor seharusnya mengimplementasikannya sesuai spesifikasi
Implementasi aktual, misalnya V8 bisa sedikit rumit, lihat jawaban ini sebagai permulaan. Anda juga dapat merujuk sumber v8 di github tetapi mungkin tidak mudah untuk memahami hanya satu bagian dalam isolasi.
Dikutip dari jawaban di atas:
Pengembang V8 di sini. Kami memiliki beberapa teknik implementasi yang berbeda untuk "builtin": beberapa ditulis dalam C ++, beberapa di Torque, beberapa dalam apa yang kami sebut CodeStubAssembler, dan beberapa langsung dalam perakitan. Dalam versi V8 sebelumnya, beberapa diimplementasikan dalam JavaScript. Masing-masing strategi ini memiliki kekuatan sendiri (menukar kompleksitas kode, kemampuan debuggabilitas, kinerja dalam berbagai situasi, ukuran biner, dan konsumsi memori); ditambah selalu ada alasan historis bahwa kode telah berkembang dari waktu ke waktu.
ES2015 spec:
- Biarkan O menjadi ToObject ( nilai ini ).
- ReturnIfAbrupt ( O ).
- Biarkan len menjadi ToLength (Get ( O ,
"length"
)).
- ReturnIfAbrupt ( len ).
- Jika IsCallable ( callbackfn ) salah , lempar pengecualian TypeError .
- Jika thisArg diberikan, misalkan T adalah thisArg ; kalau tidak biarkan T tidak terdefinisi .
- Biarkan A menjadi ArraySpeciesCreate ( O , len ).
- ReturnIfAbrupt ( A ).
- Biarkan k menjadi 0.
- Ulangi, sementara k < len
- Biarkan Pk menjadi ToString ( k ).
- Biarkan kPresent menjadi HasProperty ( O , Pk ).
- ReturnIfAbrupt ( kPresent ).
- Jika kPresent adalah benar , maka
- Biarkan kValue menjadi Get ( O , Pk ).
- ReturnIfAbrupt ( kValue ).
- Biarkan mappedValue menjadi Panggilan ( callbackfn , T , « kValue , k , O »).
- ReturnIfAbrupt ( mappedValue ).
- Biarkan status menjadi CreateDataPropertyOrThrow ( A , Pk , mappedValue ).
- ReturnIfAbrupt ( status ).
- Tambah k sebanyak 1.
- Kembali A .