Bỏ qua để đến nội dung

Indexed Collections — Array & TypedArray

Trong JavaScript, Indexed Collections là tập hợp mà các phần tử được truy cập thông qua chỉ số (index) — tức là dạng danh sách được đánh số.


Array là một đối tượng lưu trữ nhiều giá trị thuộc bất kỳ kiểu dữ liệu nào trong thứ tự xác định.

let fruits = ["apple", "banana", "orange"];
let mix = [1, "hello", true, { name: "Giang" }];

let arr = [1, 2, 3];

let numbers = [10, 20, 30];
console.log(numbers[0]); // 10
console.log(numbers.length); // 3
numbers[1] = 25;
console.log(numbers); // [10, 25, 30]

Nhóm thao tácPhương thứcGhi chú
Thêm / Xóapush(), pop(), shift(), unshift(), splice()push/pop O(1), còn lại O(n)
Duyệtfor, for...of, forEach()for...of khuyến nghị
Tìm kiếmindexOf(), find(), findIndex(), includes()includes O(n)
Biến đổimap(), filter(), reduce(), sort(), flat()Trả mảng mới (trừ sort)
Nốiconcat(), spread (...)Không thay đổi mảng gốc
Cắtslice(), splice()slice không đổi gốc, splice

let arr = [1, 2, 3];
arr.push(4); // [1, 2, 3, 4] — thêm cuối
arr.pop(); // [1, 2, 3] — xóa cuối
arr.unshift(0); // [0, 1, 2, 3] — thêm đầu
arr.shift(); // [1, 2, 3] — xóa đầu
// splice: xóa 1 phần tử tại index 1, chèn "a", "b"
arr.splice(1, 1, "a", "b"); // [1, "a", "b", 3]


// Destructuring
const [first, second, ...rest] = [1, 2, 3, 4, 5];
// first = 1, second = 2, rest = [3, 4, 5]
// Spread — clone & merge
const a = [1, 2];
const b = [3, 4];
const merged = [...a, ...b]; // [1, 2, 3, 4]
// Spread — clone (shallow)
const clone = [...a];

TypedArray là dạng mảng đặc biệt lưu trữ dữ liệu nhị phân thô (raw binary data)kiểu cố địnhđộ dài cố định.

Hiệu năng cao

Truy cập nhanh, tiết kiệm bộ nhớ hơn Array thường

Kiểu cố định

Mỗi phần tử cùng kiểu, cùng kích thước byte

Ứng dụng chuyên biệt

WebGL, Canvas, Audio API, File API, AI/ML


Typed Arrays dựa trên 2 thành phần:

  1. ArrayBuffer → vùng nhớ nhị phân thô
  2. View (TypedArray) → lớp đọc/ghi dữ liệu lên vùng nhớ đó
// Tạo vùng nhớ 16 byte
let buffer = new ArrayBuffer(16);
// Tạo "view" kiểu 32-bit integer (mỗi phần tử = 4 byte)
let view = new Int32Array(buffer);
console.log(view.length); // 4 phần tử (16 / 4)

KiểuByte/phần tửDải giá trị
Int8Array1-128 → 127
Uint8Array10 → 255
Uint8ClampedArray10 → 255 (clamped)
Int16Array2-32768 → 32767
Uint16Array20 → 65535
Int32Array4-2³¹ → 2³¹-1
Uint32Array40 → 2³²-1
Float32Array4Số thực 32-bit
Float64Array8Số thực 64-bit

let int8 = new Int8Array(4); // [0, 0, 0, 0]

let arr = new Int16Array([10, 20, 30]);
arr[1]; // 20
arr[1] = 50; // gán giá trị
// Lặp
for (let val of arr) console.log(val);
// Các phương thức có sẵn
arr.set([100, 200, 300]); // gán hàng loạt
arr.subarray(0, 2); // view con (không copy)

let typed = new Uint8Array([1, 2, 3]);
let normal = Array.from(typed); // [1, 2, 3]
let back = new Uint8Array(normal); // chuyển ngược

fetch("image.png")
.then(res => res.arrayBuffer())
.then(buf => {
let bytes = new Uint8Array(buf);
console.log("Số byte:", bytes.length);
});