Tại sao mỗi phần tử trong mảng javascript không có giá trị mặc định là 0

Chào các bác,

const arr = [0,1,2];
arr[100] = 100;
console.log(arr[50]); //undefined

Lúc này arr có kích thước là 101 phần tử (arr.length = 101) nhưng những phần tử từ arr[3] cho đến arr[99] đều undefined và nếu in arr[101], arr[200] cũng undefined. Như vậy những phần tử arr[3] --> arr[99] có tồn tại không? Nếu có tồn tại tại sao không có default value?

Em cảm ơn nhiều.

tại sao phải có giá trị mặc định là 0?

10 Likes

Cái này là bệnh lười đọc sách. Học bất cứ cái gì nên tìm sách mà đọc cho nó bài bản một chút. Và chú ý truyện sau:

Đang lang thang khắp nơi để nhặt lá, đá ống bơ thì một chàng nọ thấy cuốn bí kíp võ công trong một hốc cây. Mừng rỡ, anh ta mang cuốn sách về nhà và đọc.

Trang 1 : Miêu tả về võ công, nói rằng cuốn bí kíp có thể giúp người học hô mưa gọi gió, độc bộ thiên hạ, đạt tới cảnh giới cao của võ học.

Trang 2 : Cần phải tự cung hình mới có thể luyện.

Sau một hồi đắn đo suy nghĩ. Anh ta hạ quyết tâm vung đao để cắt của quý.

Xong việc anh nén đau đọc tiếp bí kíp.

Trang 3 : Không tự cung cũng không sao.

Anh ta nổi điên, đốt ngay cuốn bí kíp.

Khi sách cháy gần hết, trang cuối của cuốn bí kíp bay ra. Anh ta nhìn và thấy dòng chữ: Nếu đã tự thiến thì sau khi luyện thành bí kíp của quý sẽ mọc lại

7 Likes

phần tử của mảng có thể là bất cứ kiểu dữ liệu gì.
VD như mảng này.
const arr = [0,1,“hai”];
arr[100] = 100;

Nào bây h hãy trả lời giùm JavaScript engine là phần tử arr[3] nên là 0 hay là “”

7 Likes


https://blog.bitsrc.io/the-chronicles-of-javascript-objects-2d6b9205cd66

trong này có nói sơ qua về array, và object này, cái mảng nó chỉ là xin cấp phép vùng nhớ thôi, con giá trị bên trong thì phải đợi khởi tạo, mà anh chưa khởi tạo thì lấy đâu ra giá trị, nếu kiểu primary thì tại vùng nhớ đó chứa giá trị trực tiếp, còn reference thì là kiểu tham chiếu

4 Likes

Cảm ơn mọi người nhiều, mới chuyển qua code ngôn ngữ dynamic type nên em hơi lag, do code java, C# quen kiểu khai báo mảng thì mặc định các phần tử có default value.

3 Likes
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.

8 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?