Tôi đang viết một trình thông dịch JavaScript cho các thiết bị nhúng vô cùng hạn chế tài nguyên (http://www.espruino.com), và mỗi lần tôi nghĩ rằng tôi đã triển khai một số mã JavaScript chính xác, tôi nhận ra mình sai.JavaScript [] thực sự hoạt động như thế nào?
Câu hỏi của tôi bây giờ là khoảng []
. Làm thế nào bạn sẽ thực hiện một trong những bit cơ bản nhất của JavaScript một cách chính xác?
Tôi đã xem xét thông số JavaScript và có thể tôi đã không tìm thấy đúng bit, nhưng tôi không thể tìm thấy câu trả lời hữu ích.
Trước đây tôi đã giả định rằng bạn đã thực sự có hai 'bản đồ' - một cho số nguyên và một cho chuỗi. Và chiều dài mảng là giá trị của số nguyên cao nhất cộng với một. Tuy nhiên điều này dường như không đúng, theo jsconsole trên chrome:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
mà còn:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
... Vì vậy, tuyệt vời - tất cả mọi thứ được chuyển thành một chuỗi, và chuỗi giá trị cao nhất đại diện cho một số nguyên được sử dụng (cộng một) để có được chiều dài? Sai rồi.
var a = [];
a["05"] = 42;
a.length; // 0
"05"
là số nguyên hợp lệ - ngay cả trong Octal. Vậy tại sao nó không ảnh hưởng đến chiều dài?
Bạn có phải chuyển đổi chuỗi thành số nguyên không và sau đó kiểm tra xem khi nào được chuyển đổi về chuỗi, nó có khớp không?
Có ai có tham chiếu đến thuật toán chính xác được sử dụng để lưu trữ và nhận các mục trong một mảng hoặc đối tượng không? Có vẻ như nó sẽ rất đơn giản, nhưng có vẻ như nó thực sự không phải vậy!
[Tiêu chuẩn] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4) nói: "* Tên thuộc tính' P' (dưới dạng 'Chuỗi' value) là một chỉ mục mảng nếu và chỉ khi 'ToString (ToUint32 (P))' bằng với 'P' và' ToUint32 (P) 'không bằng với' 2 ** 32-1'. * ". – DCoder
Nếu bạn đang viết một thông dịch viên, các giả định không nên được sử dụng. Bạn nên đọc thông số kỹ thuật. –
Tại sao bạn không sử dụng các triển khai JS hiện có, mạnh mẽ và tuân thủ chuẩn, như V8? Những gì tôi đọc tại http://www.espruino.com/Performance nghe có vẻ khủng khiếp: -/ – Bergi