Tại sao ta không nên dùng new Array trên Javascript?

Trung tâm giáo dục thường xuyên JS xin chia sẻ với các bồ một bài thú vị về các built-in type của thằng JavaScript. Trong bài này, trung tâm giáo dục thường xuyên JS (TTGDTX JS) sẽ chia sẻ lí do vì sao không nên dùng constructor của Array. Lưu ý rằng typeof array là object.

Ví dụ:

[js]var a = new Array(1,2,3,4,5);
a[0] // returns 1
a.length // returns 5
[/js]

Nhưng ví dụ dưới thì củ chuối vãi cả nải.

[js]

var a = new Array(10);
a[0] // returns undefined
a.length // returns 10, because of reasons.

[/js]

Khi ta truyền vào constructor một element thì các phương thức (ví dụ a.length) từ class Array dạng global sẽ trả về kết quả sai. Các ngôn ngữ khác cũng có kiểu khởi tạo tương tự, chẳng hạn:

[code]

int *a = (int *) malloc( 10*sizeof(int) ); // ya ol’ c
int *a = new int[10]; // c++
int[] a = new int[10]; // java

[/code]

Ặc, nó tạo một array với chiều dài 10. Chúng ta không có hàm sizeof trong JavaScript, nhưng nếu thử với hàm toString để thấy sự buồn cười.

[js]
var a = new Array(10);

a.toString() // returns ",,,,,,,,,", a comma for each element + 1

[/js]


Các code sau lại đúng.

[js]

a.pop(); // returns last object of array, removes it
a.push(20); // puts 20 as the last element of the array, returns length
a.shift(); // returns first object of the array, removes it
a.unshift(30); // puts 30 as the first element of the array, returns length

[/js]

Sử dụng new Array[int] không có một cái ý nghĩa quái quỉ gì, và có thể gây lộn. Vì các method sẵn có của JavaScript có hơi khác người. Chẳng hạn.

[js]

var a = new Array(10);
a.push(30); // returns 11, which if it were a proper stack/queue it would return 10
a.toString() // returns ",,,,,,,,,,20", probably not what you want

[/js]

Chúng ta có thể sử dụng constructor [] để tránh các trường hợp buggy sau.

[js]

var a = [10]
a.toString() // returns "10"
a[0] // returns 10
a.length // returns 1

[/js]

Câu cuối hay nè: Am I thinking interview question here? Ask a java/c programmer to create an array of X size and then push elements to it. Just don’t be a jerk and ask questions like “What does {} + [] returns?”. That’s just mean.

Còn đây là comment: Đến 99% trường hợp chúng ta không cần dùng any built-in type (e.g. Array, Number, Boolean, Object), trừ Error:

[js]throw new Error(‘whoops!’).[/js]

Tham khảo: https://coderwall.com/p/h4xm0w/why-never-use-new-array-in-javascript

Leave a Comment