Eu acho que todo fornecedor deve implementá-lo de acordo com as especificações
A implementação real, por exemplo, a V8 pode ser um pouco complexa, consulte esta resposta para começar. Você também pode consultar a fonte v8 no github, mas pode não ser fácil entender apenas uma parte isoladamente.
Citado da resposta acima:
Desenvolvedor V8 aqui. Temos várias técnicas de implementação diferentes para "builtins": algumas são escritas em C ++, outras em Torque, outras no que chamamos de CodeStubAssembler e outras diretamente na montagem. Nas versões anteriores do V8, alguns foram implementados em JavaScript. Cada uma dessas estratégias possui seus próprios pontos fortes (troca da complexidade do código, depuração, desempenho em várias situações, tamanho binário e consumo de memória); Além disso, sempre há o motivo histórico pelo qual o código evoluiu ao longo do tempo.
Especificação do ES2015:
- Seja O como ToObject ( este valor).
- ReturnIfAbrupt ( O ).
- Seja len ToLength (Get ( O ,
"length"
)).
- ReturnIfAbrupt ( len ).
- Se IsCallable ( callbackfn ) for falso , lance uma exceção TypeError .
- Se thisArg foi fornecido, deixe- T ser thisArg ; então deixar T ser indefinido .
- Seja A ser ArraySpeciesCreate ( O , len ).
- ReturnIfAbrupt ( A ).
- Seja k 0.
- Repita, enquanto k < len
- Seja Pk o ToString ( k ).
- Seja kPresent seja HasProperty ( O , Pk ).
- ReturnIfAbrupt ( kPresent ).
- Se o kPresent for verdadeiro , então
- Seja kValue seja Get ( O , Pk ).
- ReturnIfAbrupt ( kValue ).
- Seja mappedValue seja Call ( callbackfn , T , « kValue , k , O »).
- ReturnIfAbrupt ( mappedValue ).
- Deixe o status ser CreateDataPropertyOrThrow ( A , Pk , mappedValue ).
- ReturnIfAbrupt ( status ).
- Aumente k em 1.
- Retorno A .