Tôi đoán mỗi nhà cung cấp có nghĩa vụ phải thực hiện nó theo thông số kỹ thuật
Việc triển khai thực tế, ví dụ V8 có thể hơi phức tạp, hãy tham khảo câu trả lời này để bắt đầu. Bạn cũng có thể tham khảo nguồn v8 trong github nhưng có thể không dễ hiểu chỉ một phần trong sự cô lập.
Trích dẫn từ câu trả lời trên:
Nhà phát triển V8 tại đây. Chúng tôi có một số kỹ thuật triển khai khác nhau cho "nội dung": một số được viết bằng C ++, một số bằng Torque, một số trong cái mà chúng tôi gọi là CodeStubAssembler và một số trực tiếp trong phần lắp ráp. Trong các phiên bản trước của V8, một số đã được triển khai bằng JavaScript. Mỗi chiến lược này có những điểm mạnh riêng (giao dịch về độ phức tạp của mã, khả năng sửa lỗi, hiệu suất trong các tình huống khác nhau, kích thước nhị phân và mức tiêu thụ bộ nhớ); cộng với luôn có lý do lịch sử rằng mã đã phát triển theo thời gian.
Thông số kỹ thuật ES2015:
- Đặt O là ToObject ( giá trị này ).
- Trả về IfAbrupt ( O ).
- Đặt len là ToLdrops (Get ( O ,
"length"
)).
- Trả về IfAbrupt ( len ).
- Nếu IsCallable ( callbackfn ) sai , hãy ném ngoại lệ TypeError .
- Nếu thisArg được cung cấp, hãy để T là thisArg ; khác để cho T được undefined .
- Đặt A là ArraySpeciesCreate ( O , len ).
- Trả về IfAbrupt ( A ).
- Đặt k là 0.
- Lặp lại, trong khi k < len
- Đặt LOL là ToString ( k ).
- Đặt kPftime là HasProperty ( O , Pk ).
- Return IfAbrupt ( kPftime ).
- Nếu kPftime là đúng , thì
- Đặt kValue là Get ( O , Pk ).
- Trả về IfAbrupt ( kValue ).
- Đặt mappedValue là Call ( callbackfn , T , « kValue , k , O »).
- Return IfAbrupt ( mappedValue ).
- Đặt trạng thái là CreateDataPropertyOrThrow ( A , Pk , mappedValue ).
- Return IfAbrupt ( trạng thái ).
- Tăng k thêm 1.
- Return Một .