Tại sao mảng trong JavaScript không cố định kích thước?

Xin chào các bạn,

Trong java, C# khi khai báo mảng thì mảng đó sẽ có kích thước cố định không thể thay đổi được. Muốn sử dụng mảng động phải dùng List đối với C# hoặc ArrayList đối với java. Còn trong JavaScript mặc dù khai báo mảng như này:
const arr = [1,2,3] nhưng lại sử dụng giống ArrayList
thông qua các method arr.push(4), array.pop().

Nhờ các bạn giải thích giúp. Xin cảm ơn!

1 Like

Vì ngôn ngữ nó hỗ trợ sẵn rồi.
Bản chất thực sự của mảng trong Javascript cũng chẳng cao siêu gì. Chả khác gì List, ArrayList trong các ngôn ngữ khác.
Cũng như đối tượng trong Javascript không cố định, nó có thể lưu giữ thuộc tính bất kì, không nhất thiết theo nguyên mẫu.

4 Likes

Vì người ta thiết kế như vậy.
Javascript là Javascript, c# là c#, liên quan gì nhau đâu mà so sánh?

4 Likes

Chắc là vì ông tạo ra Javascript thích thế :penguin:

Mỗi ngôn ngữ lập trình được tạo ra bởi những người khác nhau, dùng cho nhu cầu khác nhau nên đi so vậy hơi khập khiễng

Bạn có thể tự chế List, ArrayList trong JS nếu muốn

3 Likes

Vậy làm sao để cố định kích thước mảng như cách tạo mảng của các ngôn ngữ khác ạ?

Bạn học lập trình hướng đối tượng rồi động não chút là được

Nhưng mình nghĩ làm thế thường chẳng cần thiết lắm. Mỗi NNLT có phong cách riêng và ta nên chấp nhận điều đó :kissing:

2 Likes

Bạn muốn khó?
Javascript đã hỗ trợ sẵn một số chức năng có tính linh động vậy rồi mà!?

Có 2 cách:

  1. Đừng ép bản thân học Javascript (và các ngôn ngữ kế thừa từ ECMAScript).
  2. Tự viết ra ngôn ngữ tương tự Javascript, nhưng duy nhất phần mảng phải có kích thước cố định.
2 Likes

bạn cần cố định mảng cho mục đích gì?

Rồi bạn cần mảng kích thước cố định để làm gì, làm vậy có tác dụng gì hơn không. Nếu vẫn muốn kích thước tĩnh thì bạn tự viết 1 thư viện trong đó yêu cầu người dùng nhập trước số lượng phần tử, và không cho add thêm quá số lượng phần tử cho phép là được mà. Bạn có thể tự viết để phục vụ nhu cầu mà còn JS trong design nó đã như vậy rồi không thay đổi được đâu

6 Likes

Các ngôn ngữ ra đời khá lâu như C++, Java, C# có mảng tĩnh (fixed array) chủ yếu là do nhiều yếu tố như hiệu năng cao hơn, kiểm tra lỗi dễ hơn trong quá trình biên dịch từ đó bắt bug nhanh hơn. Về cơ bản, việc sinh ra mảng động của C#, JAva. Là giúp cho việc tránh sai sót trong quá trình tự quản lý bộ nhớ của lập trình viên. Nếu ở C, khi cấp phát 1 mảng mới bạn phải làm nhiều bước thì C#, Java sẽ tự lo cho bạn. Vì mục đích tụi nó sinh ra để việc lập trình tiện hơn nhưng không ảnh hưởng hiệu xuất của phần mềm.

Vì sao JS lại không cho mảng tĩnh?

  • Mục đích ban đầu của JS sinh ra là để cho mọi người tiếp cận vì sự bùng nổ của WWW khi đó (cuối thế kỷ 20). Tức mục tiêu của JS sinh ra không phải là dành cho hiệu suất, mà là sự dễ tiếp cận. JS phải tiện tới mức người học phải học JS thật nhanh.
  • Mà để nhanh thi không nên có mấy thứ rườm rà như kiểu dữ liệu, quản lý này quản lý nọ. Nên JS đã theo hướng dynamic type, lược bỏ thứ mà phải tự quản lý càng nhiều càng tốt. Cứ để JS lo. -> Nếu để mảng tĩnh -> JS sẽ có 2 loại mảng -> Rối người dùng, khi nào nên xài cái nào -> Dẹp luôn mảng tĩnh, mảng động là đủ. Ai có kinh nghiệm sẽ tự biết quản lý sau

Vậy làm sao để cố định kích thước mảng như cách tạo mảng của các ngôn ngữ khác ạ?

Tạo thì vẫn được, nhưng nó không phải là thứ dành cho người mới học. Vì JS vốn đã không cho mảng tĩnh, nên việc tạo mảng tĩnh nó trở nên bất tiện như tạo mảng động ở các ngôn ngữ khác vậy và chưa chắc có hiệu xuất tốt. Nên nếu bạn muốn học hỏi cách tạo mảng tĩnh ở JS, bạn nên tự tìm hiểu vì nó không dễ để giải thích cũng như hiện thực. Còn nếu công việc bạn yêu cầu, mình khuyến khích bạn tìm thư viện để giải quyết.

8 Likes

Cùng tên là “mảng”, cùng gọi là “mảng” nhưng bản chất thâm sâu của nó rất khác nhau.
Các ngôn ngữ biên dịch : C/C++, C#, Java,… nó gần với phần cứng hơn.
Ở đây các phần tử mảng phải có địa chỉ liên tiếp nhau trên bộ nhớ ảo.
Do đó mảng một khi đã cấp phát thì kích thước không thay đổi được. Lí do là phía trước và sau vùng nhớ của mảng hiện tại có thể có dữ liệu khác.
Muốn thay kích thước khác chỉ có cách cấp phát mảng mới rồi copy dữ liệu qua.

Các ngôn ngữ thông dịch : javascript, python… thì mảng nó là cái gì đó phức tạp hơn khá nhiều.
Nó có thể không yêu cầu sự liên tục về địa chỉ trên bộ nhớ ảo, hoặc nó giống một danh sách liên kết đơn hơn.

5 Likes

Thực ra sau này (ECMA2015) JS cũng có mảng cố định kích thước (qua constructor) nhưng toàn là integer, float và double thôi :smiley:
https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray-objects

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