const arr = [0,1,2];
Array là reference type, nên array được tạo như một object bình thường. Tuy nhiên, dựa vào giá trị khởi tạo, mà JS Engine sử dụng BytedArray
để lưu giá trị cho arr
.
arr[100] = 100;
Như đã nói, array giống như object, nó thực hiện gồm hai bước
- chuyển 100 từ số nguyên thành chuỗi
"100"
.
- gán giá trị 100 vào thuộc tính
"100"
của arr
.
Lúc này trong nội bộ arr
sẽ có 2 cấu trúc dữ liệu
-
BytedArray
cho thuộc tính "0"
, "1"
, "2"
, nhận giá trị lần lượt là 0, 1 và 2.
- một property là
"100"
, có giá trị là 100.
console.log(arr[50]); // undefined
Khi truy cập thuộc tính 50
, JS Engine thực hiện các bước
- Chuyển số nguyên 50 thành chuỗi
"50"
- Truy cập thuộc tính
"50"
, tìm không thấy, trả về undefined
.
console.log(arr.length); // 101
Thuộc tính của object luôn được sắp xếp lại, trong đó danh sách thuộc tính ưu tiên hàng đầu là enumerable properties. Một property được gọi là enumerable nếu tên thuộc tính là một con số. Bất kì một reference type, không nhất thiết phải là array type, đều có các thuộc tính enumerable. Do đó mới phát sinh khái niệm array-like object.
Quay trở lại biến arr
, khi đó đối tượng arr
có 3 properties được xếp vào enumerable là “0”, “1”, “2”, “100”. Khi đó arr.length
được tính toán vào enumerable property cuối cùng, cụ thể là “100”, và được giá trị arr.length
là 101.