1000 Bài tập JavaScript - Lập Trình JavaScript
Tạo một tầng chứa 3 liên kết. Chuột click tại vị trí nào thì tầng sẽ được đặt tại vị trí đó. Gợi ý: Viết lệnh trong sự kiện onClick của thẻ BODY.
PHẦN 1: NHẬP MÔN, TOÁN TỬ VÀ KIỂU DỮ LIỆU (1 - 100)
Mục tiêu: Làm quen cú pháp, khai báo biến, các phép toán số học và logic.
In chuỗi "Chào mừng bạn đến với khóa học JavaScript" ra console.
Khai báo 2 biến
a,bvà in ra tổng, hiệu, tích, thương của chúng.Tính chu vi và diện tích hình chữ nhật với chiều dài và chiều rộng nhập từ người dùng.
Tính diện tích hình tam giác khi biết độ dài cạnh đáy và chiều cao.
Tính diện tích và chu vi hình tròn với bán kính $r$.
Viết chương trình hoán đổi giá trị của hai biến số không dùng biến trung gian.
Tính giá trị biểu thức $P = (a + b)^2$ với $a, b$ cho trước.
Tính giá trị biểu thức $Q = \sqrt{a^2 + b^2}$.
Chuyển đổi nhiệt độ từ Celsius sang Fahrenheit.
Chuyển đổi số phút sang định dạng "X giờ Y phút".
Tính vận tốc khi biết quãng đường và thời gian.
Tính chỉ số BMI và in kết quả.
Tính tiền lương nhân viên = (Lương cơ bản * Hệ số) + Phụ cấp.
Tính tổng 3 chữ số của một số nguyên có 3 chữ số (VD: 123 -> 1+2+3=6).
Tính giá trị trung bình cộng của 5 số bất kỳ.
Tìm số dư của phép chia $2^{10}$ cho 3.
Kiểm tra một biến có phải kiểu
numberhay không.Kiểm tra một chuỗi có độ dài lớn hơn 10 ký tự hay không.
Nối hai chuỗi "Học lập trình" và "rất thú vị" thành một chuỗi hoàn chỉnh.
In ra ký tự cuối cùng của một chuỗi bất kỳ.
Trích xuất chuỗi con từ vị trí thứ 2 đến vị trí thứ 5 của một chuỗi.
Thay thế tất cả khoảng trắng trong chuỗi bằng dấu gạch ngang (-).
Chuyển đổi một chuỗi số thành kiểu dữ liệu Number.
Chuyển đổi một số thành kiểu dữ liệu String.
Kiểm tra xem một chuỗi có chứa từ "JavaScript" hay không.
Làm tròn số thập phân 3.14159 thành 3.14.
Tìm số lớn nhất và nhỏ nhất trong 3 số $a, b, c$.
Phát sinh một số ngẫu nhiên từ 1 đến 100.
Tính lũy thừa $x^y$.
Tính trị tuyệt đối của một số âm.
(Tiếp tục tương tự đến bài 100 với các biến thể về toán tử logic AND/OR/NOT...)
PHẦN 2: CẤU TRÚC ĐIỀU KIỆN IF-ELSE VÀ SWITCH (101 - 200)
Mục tiêu: Rèn luyện tư duy rẽ nhánh và giải quyết vấn đề.
Kiểm tra một số là số chẵn hay số lẻ.
Kiểm tra một số là số âm, số dương hay số 0.
Kiểm tra một năm có phải năm nhuận hay không.
Nhập điểm trung bình, xếp loại học lực (Giỏi, Khá, Trung bình, Yếu).
Kiểm tra 3 cạnh nhập vào có tạo thành một tam giác hợp lệ không.
Giải phương trình bậc nhất $ax + b = 0$.
Giải phương trình bậc hai $ax^2 + bx + c = 0$.
Nhập vào một tháng, in ra tháng đó có bao nhiêu ngày.
Kiểm tra một ký tự nhập vào là nguyên âm hay phụ âm.
Viết chương trình mô phỏng máy tính bỏ túi (Cộng, Trừ, Nhân, Chia).
Nhập tuổi và kiểm tra xem người đó có đủ tuổi bầu cử (>=18) không.
Tính tiền điện theo bậc thang (với các mức giá khác nhau).
Tính thuế thu nhập cá nhân dựa trên mức lương.
Kiểm tra một số có phải là số chính phương hay không.
Nhập mã giảm giá, tính số tiền được giảm (10%, 20%, 50%).
Kiểm tra một số có chia hết cho cả 3 và 5 hay không.
Tìm số ngày của một năm bất kỳ.
Kiểm tra xem một điểm $(x, y)$ có nằm trong hình tròn bán kính $R$ hay không.
Nhập 3 số, in ra theo thứ tự tăng dần.
Xác định quý trong năm dựa vào tháng nhập vào.
PHẦN 3: VÒNG LẶP FOR, WHILE, DO-WHILE (201 - 300)
Mục tiêu: Xử lý dữ liệu lặp lại và thuật toán cơ bản.
In ra các số từ 1 đến 100.
In ra các số chẵn từ 1 đến $n$.
Tính tổng các số từ 1 đến $n$.
Tính giai thừa của một số nguyên dương $n$.
In bảng cửu chương của một số bất kỳ.
Đếm số lượng các chữ số của một số nguyên dương.
Đảo ngược một số nguyên (VD: 1234 -> 4321).
Kiểm tra một số có phải là số nguyên tố hay không.
In ra $n$ số đầu tiên trong dãy Fibonacci.
Tìm ước chung lớn nhất (UCLN) của hai số.
Tìm bội chung nhỏ nhất (BCNN) của hai số.
In ra các số nguyên tố từ 1 đến 1000.
Tính tổng các chữ số của một số.
Kiểm tra một số có phải là số Armstrong hay không.
Vẽ hình chữ nhật bằng dấu sao (*) với kích thước $m \times n$.
Vẽ tam giác vuông cân bằng dấu sao.
Vẽ tam giác cân bằng dấu sao.
Tính tổng dãy số $S = 1 + 1/2 + 1/3 + ... + 1/n$.
Tìm tất cả các ước số của một số nguyên dương.
Kiểm tra một số có phải số hoàn hảo (Perfect Number) không.
Đếm số lần xuất hiện của một ký tự trong chuỗi.
In ra các số từ 1 đến 100, nhưng bỏ qua các số chia hết cho 7.
Mô phỏng trò chơi đoán số (người dùng nhập đến khi đúng).
Tính tổng các số lẻ trong khoảng từ $a$ đến $b$.
Chuyển đổi một số từ hệ thập phân sang hệ nhị phân.
Chào bạn, tôi rất sẵn lòng tiếp tục đồng hành cùng bạn để xây dựng ngân hàng đề bài này. Dưới đây là 250 bài tập tiếp theo (từ bài 301 đến 550), tập trung sâu vào Mảng (Array), Hàm (Function) và Xử lý Chuỗi nâng cao.
Đây là những phần quan trọng nhất để sinh viên rèn luyện tư duy thuật toán và cấu trúc dữ liệu.
PHẦN 4: MẢNG (ARRAY) - CƠ BẢN ĐẾN TRUNG CẤP (301 - 425)
Mục tiêu: Quản lý danh sách dữ liệu, duyệt mảng và các thao tác thêm/xóa/sửa.
Khai báo một mảng số nguyên và in ra tất cả các phần tử.
Tìm phần tử lớn nhất và nhỏ nhất trong một mảng.
Tính tổng và trung bình cộng của các phần tử trong mảng.
Đếm số lượng số chẵn và số lẻ trong mảng.
Tìm một giá trị $x$ xem có tồn tại trong mảng hay không và trả về vị trí.
Đảo ngược thứ tự các phần tử trong mảng (không dùng hàm có sẵn).
Sắp xếp mảng số nguyên theo thứ tự tăng dần.
Sắp xếp mảng số nguyên theo thứ tự giảm dần.
Lọc ra các số nguyên tố có trong mảng.
Xóa phần tử tại một vị trí $k$ cho trước.
Chèn một phần tử $x$ vào vị trí $k$ trong mảng.
Tìm phần tử xuất hiện nhiều nhất trong mảng.
Loại bỏ các phần tử trùng lặp trong mảng (chỉ giữ lại 1).
Tách một mảng thành hai mảng: một mảng chứa số chẵn, một mảng chứa số lẻ.
Gộp hai mảng đã sắp xếp thành một mảng mới vẫn đảm bảo thứ tự.
Tìm số lớn thứ hai trong mảng.
Kiểm tra xem mảng có phải là mảng đối xứng hay không.
Tính tích của tất cả các phần tử ở vị trí lẻ trong mảng.
Thay thế tất cả các số âm trong mảng bằng số 0.
Đếm số lần xuất hiện của từng phần tử trong mảng.
Tìm mảng con có tổng lớn nhất (Thuật toán Kadane).
Xoay vòng các phần tử của mảng sang trái $k$ đơn vị.
Kiểm tra mảng có chứa mảng con cho trước hay không.
Tìm khoảng cách nhỏ nhất giữa hai phần tử bất kỳ trong mảng.
Tạo một mảng mới chứa bình phương của các phần tử trong mảng cũ.
PHẦN 5: HÀM (FUNCTIONS) & SCOPE (426 - 500)
Mục tiêu: Đóng gói mã nguồn, tham số, giá trị trả về và tư duy tái sử dụng.
Viết hàm tính diện tích hình thang.
Viết hàm kiểm tra một số có phải số hoàn hảo hay không.
Viết hàm tìm ước chung lớn nhất của hai số.
Viết hàm nhận vào một mảng và trả về mảng đã được sắp xếp.
Viết hàm tính tổng các chữ số của một số bằng phương pháp đệ quy.
Viết hàm tính số hạng thứ $n$ của dãy Fibonacci bằng đệ quy.
Viết hàm chuyển đổi một chuỗi thành dạng "Title Case" (Ví dụ: "hello world" -> "Hello World").
Viết hàm nhận vào danh sách điểm và trả về điểm trung bình.
Viết hàm kiểm tra một chuỗi có phải là chuỗi hợp lệ (không chứa ký tự đặc biệt).
Viết hàm nhận vào một năm và trả về thế kỷ tương ứng.
Viết hàm tính tiền taxi dựa trên số km (giá mở cửa, giá dưới 10km, giá trên 10km).
Viết hàm tính giai thừa của $n$ bằng cả hai cách: vòng lặp và đệ quy.
Viết hàm lọc các số chia hết cho $k$ trong một mảng.
Viết hàm mô phỏng trò chơi tung xúc xắc.
Viết hàm nhận vào ngày/tháng/năm và kiểm tra tính hợp lệ của ngày đó.
Viết hàm tìm từ dài nhất trong một câu.
Viết hàm tính tổng các số trong một mảng đa chiều (Flatten array).
Viết hàm thực hiện phép nhân ma trận đơn giản (mảng 2 chiều).
Viết hàm
maptùy chỉnh (không dùngArray.prototype.map).Viết hàm
filtertùy chỉnh.Viết hàm tạo mật khẩu ngẫu nhiên với độ dài $n$.
Viết hàm kiểm tra xem hai mảng có giống hệt nhau hay không.
Viết hàm tính số ngày chênh lệch giữa hai mốc thời gian.
Viết hàm tính giá trị đa thức tại một điểm $x$.
Viết hàm giải mã một chuỗi đơn giản (ví dụ: dịch chuyển ký tự theo bảng chữ cái).
PHẦN 6: ĐỐI TƯỢNG (OBJECTS) & JSON (501 - 550)
Mục tiêu: Quản lý dữ liệu theo cấu trúc Key-Value, mô phỏng thực tế.
Khai báo một đối tượng
SinhVienvới các thuộc tính: tên, tuổi, mã số, điểm trung bình.Viết phương thức in ra thông tin đầy đủ của đối tượng trên.
Tạo một mảng chứa 5 đối tượng
SanPham(tên, giá, số lượng).Viết hàm tính tổng giá trị kho hàng (giá * số lượng của tất cả sản phẩm).
Lọc ra các sản phẩm có giá lớn hơn 500.000đ.
Cập nhật số lượng của một sản phẩm trong mảng dựa trên mã sản phẩm.
Sắp xếp danh sách sinh viên theo điểm trung bình giảm dần.
Chuyển đổi một Object thành chuỗi JSON và ngược lại.
Viết hàm kiểm tra xem một Object có rỗng hay không.
Hợp nhất hai đối tượng (Merge objects) có cùng cấu trúc.
Viết hàm đếm số lượng thuộc tính của một Object.
Tạo một đối tượng
CuaHangchứa mảng các đối tượngSanPham, viết hàm tìm kiếm sản phẩm theo tên.Mô phỏng một cuốn từ điển đơn giản bằng Object.
Viết hàm sao chép sâu (Deep Clone) một đối tượng.
Tạo đối tượng
DongHocó phương thức hiển thị thời gian hiện tại mỗi giây.
Chào thầy, tôi tiếp tục hành trình xây dựng 1000 bài tập cho sinh viên. Phần này chúng ta sẽ bước vào giai đoạn quan trọng nhất của JavaScript Frontend: Thao tác với trình duyệt (DOM) và Xử lý bất đồng bộ.
Đây là những bài tập giúp sinh viên tạo ra được các ứng dụng thực tế thay vì chỉ chạy trên màn hình đen (Console).
PHẦN 7: DOM & EVENTS - TƯƠNG TÁC TRÌNH DUYỆT (551 - 700)
Mục tiêu: Truy xuất phần tử HTML, thay đổi nội dung, kiểu dáng và xử lý hành động người dùng.
Truy xuất một thẻ
<h1>bằng ID và thay đổi nội dung văn bản của nó.Thay đổi màu nền của trang web khi người dùng nhấn vào một nút (Button).
Ẩn/Hiện một hình ảnh khi nhấn vào một nút "Toggle".
Đếm số lần người dùng đã nhấn vào một nút và hiển thị con số đó lên màn hình.
Viết chương trình thay đổi kích thước phông chữ của một đoạn văn khi di chuột (hover) qua.
Tạo một form nhập tên và hiển thị lời chào "Xin chào + tên" ngay dưới form khi nhấn Submit.
Thay đổi thuộc tính
srccủa một thẻ<img>để đổi hình ảnh khác.Thêm một mục mới (
<li>) vào một danh sách (<ul>) có sẵn.Xóa một phần tử cụ thể khỏi danh sách khi nhấn vào chính phần tử đó.
Kiểm tra độ dài mật khẩu trong ô Input, nếu dưới 8 ký tự thì hiển thị thông báo màu đỏ.
Tạo hiệu ứng "Đèn giao thông": Thay đổi màu sắc của một vòng tròn sau mỗi 3 giây.
Viết chương trình "Đồng hồ bấm giờ" (Start, Stop, Reset).
Tạo một bảng cửu chương hiển thị dưới dạng bảng HTML (
<table>).Xây dựng bộ lọc tìm kiếm danh sách: Khi gõ vào ô Input, các mục không khớp sẽ bị ẩn đi.
Thực hiện chức năng "Select All" cho các Checkbox trong một danh sách.
Hiển thị tọa độ chuột ($x, y$) lên màn hình khi chuột di chuyển trên trang web.
Tạo một Modal (Hộp thoại) đơn giản xuất hiện khi nhấn nút và đóng lại khi nhấn dấu "X".
Thay đổi Class CSS của một phần tử khi cuộn chuột (Scroll) xuống một vị trí nhất định.
Tạo trò chơi "Kéo và Thả" (Drag and Drop) cơ bản giữa hai vùng chứa.
Ngăn chặn hành vi mặc định của thẻ
<a>(không cho nhảy trang) khi nhấn vào.
PHẦN 8: BẤT ĐỒNG BỘ - PROMISE, ASYNC/AWAIT & API (701 - 850)
Mục tiêu: Xử lý các tác vụ tốn thời gian như lấy dữ liệu từ Server.
Sử dụng
setTimeoutđể in ra dòng chữ "Hết giờ" sau 5 giây.Sử dụng
setIntervalđể tạo một đồng hồ hiển thị giờ : phút : giây cập nhật liên tục.Viết một hàm trả về một Promise và xử lý kết quả bằng
.then()và.catch().Sử dụng
fetch()để lấy danh sách "To-do" từ một API giả lập (như JSONPlaceholder).Hiển thị danh sách người dùng lấy được từ API lên giao diện dưới dạng thẻ (Card).
Viết hàm
fetchdữ liệu kèm theo xử lý lỗi (Error Handling) bằngtry...catch.Tạo chức năng tìm kiếm thông tin thời tiết của một thành phố thông qua OpenWeatherMap API.
Thực hiện gửi dữ liệu (POST request) từ một Form lên Server giả lập.
Viết chương trình đợi nhiều Promise hoàn thành cùng lúc bằng
Promise.all().Tạo hiệu ứng "Loading..." (vòng quay) hiển thị trong khi đợi dữ liệu từ API trả về.
Viết hàm tự động tải lại dữ liệu sau mỗi 30 giây.
Sử dụng
async/awaitđể thực hiện chuỗi hành động: Đăng nhập -> Lấy thông tin -> Hiển thị.Xây dựng chức năng "Load More": Tải thêm 10 sản phẩm khi nhấn nút ở cuối trang.
Lưu trữ danh sách yêu thích vào
LocalStorageđể khi F5 trang dữ liệu không bị mất.Viết chương trình kiểm tra trạng thái Online/Offline của trình duyệt và thông báo cho người dùng.
PHẦN 9: ES6+ & CÁC KHÁI NIỆM NÂNG CAO (851 - 950)
Mục tiêu: Sử dụng cú pháp hiện đại và lập trình hướng đối tượng.
Sử dụng
Destructuringđể trích xuất dữ liệu từ một Object phức tạp.Sử dụng
Spread Operatorđể gộp hai mảng và thêm một phần tử vào giữa.Viết hàm sử dụng
Rest Parameterđể tính tổng của một số lượng tham số bất kỳ.Khai báo một lớp (
Class)Animalvà các lớp con kế thừa từ nó.Tạo lớp
Uservới các phương thứcgettervàsettercho thuộc tính mật khẩu.Viết chương trình quản lý thư viện sách bằng OOP (Class Book, Class Library).
Sử dụng
Setđể lọc các giá trị trùng lặp từ một mảng lớn.Sử dụng
Mapđể lưu trữ danh bạ điện thoại và tìm kiếm theo tên.Tìm hiểu và minh họa về
Closuretrong JavaScript qua một hàm tăng số (counter).Viết một hàm
Curryingđể tính tiền thuế theo các mức khác nhau.Minh họa sự khác biệt giữa
Shallow CopyvàDeep Copybằng ví dụ cụ thể.Tạo một
Moduleriêng biệt (export/import) để xử lý các phép toán số học.Viết hàm sử dụng
Generator functionđể tạo ra một dãy số vô hạn.Thực hiện kỹ thuật
Debouncecho ô nhập liệu tìm kiếm để tối ưu hóa API call.Thực hiện kỹ thuật
Throttlecho sự kiện cuộn trang (Scroll).
Chào thầy, đây là 50 bài tập cuối cùng (951 - 1000).
Phần này không còn là các câu hỏi rời rạc mà là các Mini Projects (Dự án nhỏ) và Thử thách thuật toán nâng cao. Đây là giai đoạn để sinh viên tổng hợp toàn bộ kiến thức từ biến, mảng, hàm cho đến DOM, API và OOP để tạo ra sản phẩm hoàn chỉnh.
PHẦN 11: THUẬT TOÁN & CẤU TRÚC DỮ LIỆU (901 - 1000)
Mục tiêu: Rèn luyện tư duy tối ưu hóa, độ phức tạp thuật toán (Big O) và xử lý dữ liệu phức tạp.
Viết thuật toán tìm kiếm nhị phân (Binary Search) trên một mảng đã sắp xếp.
Thực hiện thuật toán sắp xếp nổi bọt (Bubble Sort).
Thực hiện thuật toán sắp xếp chọn (Selection Sort).
Thực hiện thuật toán sắp xếp chèn (Insertion Sort).
Thực hiện thuật toán sắp xếp nhanh (Quick Sort) dùng đệ quy.
Thực hiện thuật toán sắp xếp trộn (Merge Sort).
Tìm kiếm theo chiều rộng (BFS) trên một cấu trúc cây thư mục đơn giản.
Tìm kiếm theo chiều sâu (DFS) để duyệt qua các Object lồng nhau.
Viết chương trình kiểm tra các dấu ngoặc hợp lệ trong một biểu thức (Sử dụng Stack).
Đảo ngược một danh sách liên kết đơn (Linked List).
Tìm độ dài của chuỗi con dài nhất không có ký tự lặp lại.
Giải bài toán "Two Sum": Tìm hai số trong mảng có tổng bằng một giá trị cho trước.
Giải bài toán "Three Sum": Tìm bộ ba số có tổng bằng 0.
Viết thuật toán nén chuỗi đơn giản (Ví dụ: "aaabb" -> "a3b2").
Kiểm tra xem hai chuỗi có phải là Anagram của nhau không (Đảo chữ).
Tìm số lần xuất hiện của một từ trong một đoạn văn bản lớn.
Thuật toán tìm số lớn thứ K trong một mảng chưa sắp xếp.
Chuyển đổi số La Mã thành số nguyên.
Chuyển đổi số nguyên thành số La Mã.
Viết hàm kiểm tra một số có phải là số Happy (Happy Number) hay không.
Tìm giao điểm của hai mảng (Intersection of two arrays).
Thuật toán "Cái túi" (Knapsack Problem) phiên bản đơn giản.
Tìm đường đi ngắn nhất trong mê cung ô vuông (Sử dụng BFS).
Viết hàm tính số cách leo lên cầu thang $n$ bậc (mỗi lần bước 1 hoặc 2 bậc).
Tìm tất cả các hoán vị của một chuỗi ký tự.
Thuật toán phát hiện chu trình trong một danh sách liên kết.
Hợp nhất $k$ danh sách đã sắp xếp.
Tìm từ chung có độ dài lớn nhất (Longest Common Prefix).
Giải bài toán 8 quân hậu (8-Queens Problem) trên bàn cờ.
Viết chương trình kiểm tra xem một biểu thức toán học (dạng chuỗi) có đúng cú pháp không.
PHẦN 12: JAVASCRIPT TRONG MÔI TRƯỜNG NODE.JS & BACKEND (931 - 960)
Mục tiêu: Mở rộng kiến thức sang phía Server-side.
Viết chương trình đọc nội dung từ một file
.txtbằng modulefs.Viết chương trình ghi dữ liệu người dùng vào một file JSON.
Tạo một HTTP Server đơn giản không dùng framework.
Xây dựng ứng dụng Console nhận tham số từ dòng lệnh (Command line arguments).
Viết script tự động đổi tên hàng loạt file trong một thư mục.
Tạo một ứng dụng Chat đơn giản sử dụng Socket.io.
Thực hiện băm mật khẩu (Hashing) bằng thư viện
bcrypt.Viết middleware kiểm tra quyền truy cập (Authentication) đơn giản.
Xây dựng API trả về thời gian hệ thống dưới dạng JSON.
Thực hiện gửi Email tự động từ Node.js.
PHẦN 13: KIỂM THỬ & TỐI ƯU HÓA (961 - 1000)
Mục tiêu: Đảm bảo chất lượng code và hiệu suất.
Viết Unit Test cho hàm tính tổng bằng thư viện Jest.
Viết Test Case cho chức năng đăng nhập (đúng/sai tài khoản).
Thực hiện đo thời gian thực thi của một hàm bằng
console.time().Tối ưu hóa một vòng lặp lồng nhau để giảm độ phức tạp từ $O(n^2)$ xuống $O(n)$.
Sử dụng
Memoizationđể tăng tốc hàm tính Fibonacci đệ quy.Viết script kiểm tra xem một trang web có bị lỗi liên kết (Broken links) hay không.
Thực hiện Lazy Loading cho hình ảnh bằng JavaScript thuần.
Viết hàm kiểm tra rò rỉ bộ nhớ (Memory Leak) đơn giản.
Xây dựng hệ thống Log để ghi lại các lỗi xảy ra trong ứng dụng.
Bài tập cuối cùng (1000): Xây dựng một Framework nhỏ đơn giản có khả năng Data-binding (giống Vue hoặc React cơ bản).
PHẦN 11: DỰ ÁN TỔNG HỢP & THỬ THÁCH THỰC TẾ (951 - 1000)
Mục tiêu: Xây dựng sản phẩm có khả năng vận hành thực tế và tối ưu mã nguồn.
Nhóm 1: Ứng dụng Quản lý & Tiện ích (951 - 970)
To-Do List nâng cao: Thêm, sửa, xóa công việc, đánh dấu hoàn thành và lưu vào LocalStorage.
Máy tính bỏ túi (Calculator): Thiết kế giao diện giống máy tính thật, xử lý được các phép tính lũy thừa và căn bậc hai.
Ứng dụng đếm ngược (Countdown Timer): Cho phép người dùng chọn ngày/giờ và đếm ngược từng giây đến sự kiện đó.
Sổ địa chỉ (Contact Book): Quản lý danh sách liên hệ, có chức năng tìm kiếm theo tên và lọc theo nhóm.
Ứng dụng quản lý chi tiêu: Nhập số tiền thu/chi, hiển thị tổng số dư và danh sách lịch sử giao dịch.
Chuyển đổi tiền tệ Real-time: Sử dụng API để lấy tỷ giá mới nhất và chuyển đổi giữa ít nhất 10 loại ngoại tệ.
Trình phát nhạc đơn giản: Có các nút Play/Pause, Next/Prev, thanh tiến trình (Progress Bar) và hiển thị tên bài hát.
Ứng dụng dự báo thời tiết: Hiển thị nhiệt độ, độ ẩm, tốc độ gió và icon thời tiết dựa trên vị trí người dùng.
Trình quản lý mật khẩu: Tạo mật khẩu ngẫu nhiên và lưu trữ chúng (mã hóa đơn giản) trong trình duyệt.
Ứng dụng ghi chú (Notes App): Hỗ trợ định dạng Markdown đơn giản và tự động lưu khi đang soạn thảo.
Nhóm 2: Trò chơi & Tương tác (971 - 985)
Trò chơi đoán số: Máy tính chọn một số, người chơi đoán và nhận gợi ý "Cao hơn/Thấp hơn".
Trò chơi "Oẳn tù tì": Đấu với máy, tính điểm số hiệp thắng và hiển thị lịch sử các ván đấu.
Trò chơi "Lật thẻ bài" (Memory Card Game): Tìm các cặp hình giống nhau trong một khoảng thời gian nhất định.
Trò chơi "Rắn săn mồi" (Snake Game): Sử dụng Canvas API để vẽ và điều khiển rắn bằng phím mũi tên.
Trò chơi "Dò mìn" (Minesweeper): Tạo lưới ô vuông, đặt mìn ngẫu nhiên và xử lý thuật toán loang khi mở ô trống.
Ứng dụng Quiz trắc nghiệm: Hiển thị câu hỏi có thời gian đếm ngược, tính điểm và hiển thị đáp án đúng ở cuối.
Trò chơi "Caro" (Tic-tac-toe): Kiểm tra điều kiện thắng (3 ô liên tiếp) và cho phép chơi hai người hoặc đấu với máy.
Ứng dụng vẽ (Drawing App): Cho phép người dùng vẽ lên màn hình, chọn màu sắc và kích thước bút vẽ.
Nhóm 3: Thuật toán & Hệ thống (986 - 1000)
Trình kiểm tra độ mạnh mật khẩu: Đánh giá dựa trên chiều dài, ký tự đặc biệt, số và chữ hoa.
Thuật toán sắp xếp trực quan: Hiển thị quá trình mảng thay đổi vị trí khi dùng Bubble Sort hoặc Quick Sort bằng DOM.
Xây dựng Validator cho Form: Tự động kiểm tra Email, Số điện thoại, Mật khẩu ngay khi người dùng đang nhập.
Ứng dụng đọc tin tức (News Aggregator): Sử dụng NewsAPI để lấy tin tức mới nhất theo các danh mục khác nhau.
Hệ thống phân trang (Pagination): Chia một danh sách 100 phần tử thành các trang, mỗi trang 10 phần tử.
Tính năng Dark Mode: Chuyển đổi giao diện sáng/tối và ghi nhớ lựa chọn của người dùng qua phiên làm việc sau.
Infinite Scroll: Tự động tải thêm nội dung khi người dùng cuộn xuống cuối trang (giống Facebook/Instagram).
Autocomplete Search: Gợi ý các từ khóa liên quan khi người dùng gõ vào ô tìm kiếm.
Trình xử lý ảnh cơ bản: Sử dụng Canvas để tạo bộ lọc đen trắng, đảo ngược màu hoặc làm mờ ảnh.
Giỏ hàng (Shopping Cart): Xử lý thêm sản phẩm, cập nhật số lượng, tính tổng tiền và xóa sản phẩm khỏi giỏ.
Xây dựng Router đơn giản cho Single Page Application (SPA): Chuyển trang mà không cần tải lại trình duyệt.
Bài tập cuối cùng: Xây dựng một trang Web cá nhân (Portfolio) hoàn chỉnh sử dụng tất cả các kỹ thuật trên.