Bộ 6 - Trắc nghiệm JavaScript (JS Quiz) online có đáp án
Thời gian còn lại: --:--
Kết quả của bạn:
Bạn đã đúng:
Bạn đã sai:
Tổng số câu:
Câu 1:Trong JavaScript, kết quả của biểu thức 'typeof null' là gì?
💡 Lời giải chi tiết:
Theo đặc tả kỹ thuật của JavaScript từ phiên bản đầu tiên, 'null' được coi là một tham chiếu đối tượng rỗng nên toán tử typeof trả về giá trị 'object'. Kết luận Lý giải object
Câu 2:Sự khác biệt chính giữa toán tử '==' và '===' trong JavaScript là gì?
💡 Lời giải chi tiết:
Toán tử '==' thực hiện so sánh trừu tượng (ép kiểu nếu cần), trong khi '===' thực hiện so sánh nghiêm ngặt mà không ép kiểu. Kết luận Lý giải '==' chỉ so sánh giá trị sau khi ép kiểu, '===' so sánh cả giá trị và kiểu dữ liệu.
Câu 3:Kết quả của lệnh 'console.log(0.1 + 0.2 === 0.3)' là gì?
💡 Lời giải chi tiết:
Do cách biểu diễn số thực dấu phẩy động theo chuẩn IEEE 754, tổng của 0.1 và 0.2 trong JavaScript thực tế là 0.30000000000000004. Kết luận Lý giải false
Câu 4:Khi sử dụng từ khóa 'var' bên trong một hàm, biến đó có phạm vi (scope) như thế nào?
💡 Lời giải chi tiết:
Biến khai báo bằng 'var' có phạm vi hàm, nghĩa là nó chỉ có thể truy cập được bên trong hàm mà nó được định nghĩa. Kết luận Lý giải Phạm vi hàm (Function scope).
Câu 5:Từ khóa 'const' trong JavaScript có ý nghĩa gì đối với một biến kiểu đối tượng (Object)?
💡 Lời giải chi tiết:
'const' ngăn chặn việc tái gán định danh của biến nhưng không ngăn cản việc sửa đổi nội dung của đối tượng mà biến đó tham chiếu tới. Kết luận Lý giải Không thể gán lại biến đó cho một đối tượng khác nhưng có thể thay đổi thuộc tính của nó.
Câu 6:Trong JavaScript, 'Hoisting' là cơ chế như thế nào?
💡 Lời giải chi tiết:
Hoisting cho phép trình thông dịch JavaScript di chuyển phần khai báo (không bao gồm phần gán) của biến và hàm lên đầu phạm vi hiện tại. Kết luận Lý giải Cơ chế đưa các khai báo biến và hàm lên đầu phạm vi của chúng trước khi thực thi mã.
Câu 7:Kết quả của 'console.log(typeof NaN)' là gì?
💡 Lời giải chi tiết:
Mặc dù NaN viết tắt của 'Not-a-Number', về mặt kỹ thuật nó vẫn thuộc kiểu dữ liệu số trong đặc tả JavaScript. Kết luận Lý giải number
Câu 8:Phương thức 'Array.prototype.map()' trả về giá trị gì?
💡 Lời giải chi tiết:
Phương thức 'map' tạo ra một mảng hoàn toàn mới mà không làm thay đổi mảng ban đầu sau khi áp dụng hàm cho từng phần tử. Kết luận Lý giải Một mảng mới với các phần tử là kết quả của hàm callback.
Câu 9:Sự khác biệt về 'this' giữa hàm thông thường (regular function) và hàm mũi tên (arrow function) là gì?
💡 Lời giải chi tiết:
Hàm mũi tên không tự định nghĩa ngữ cảnh 'this' riêng mà sử dụng giá trị 'this' từ môi trường thực thi bên ngoài của nó. Kết luận Lý giải Hàm mũi tên kế thừa 'this' từ phạm vi bao quanh nó (lexical scope), còn hàm thông thường định nghĩa 'this' khi gọi.
Câu 10:Lệnh nào được sử dụng để bắt lỗi trong JavaScript khi thực thi một đoạn mã có khả năng gây lỗi?
💡 Lời giải chi tiết:
Cấu trúc try...catch cho phép lập trình viên kiểm soát các ngoại lệ và ngăn chặn ứng dụng bị dừng đột ngột khi gặp lỗi. Kết luận Lý giải try...catch
Câu 11:Trong 'Promise.all([p1, p2, p3])', kết quả sẽ như thế nào nếu một trong các Promise (ví dụ p2) bị 'rejected'?
💡 Lời giải chi tiết:
Promise.all hoạt động theo cơ chế 'tất cả hoặc không gì cả', sẽ trả về lỗi ngay khi có bất kỳ Promise nào trong danh sách thất bại. Kết luận Lý giải Nó sẽ bị 'rejected' ngay lập tức với lý do từ Promise bị lỗi đầu tiên.
Câu 12:Toán tử '??' (Nullish Coalescing) trả về giá trị bên phải khi nào?
💡 Lời giải chi tiết:
Khác với toán tử OR (||), toán tử ?? chỉ quan tâm đến các giá trị 'nullish' là null và undefined thay vì mọi giá trị 'falsy'. Kết luận Lý giải Khi giá trị bên trái là 'null' hoặc 'undefined'.
Câu 13:Lệnh 'JSON.parse()' được dùng để làm gì?
💡 Lời giải chi tiết:
Hàm JSON.parse() phân tích cú pháp một chuỗi ký tự theo định dạng JSON và dựng lại giá trị hoặc đối tượng JavaScript được mô tả bởi chuỗi đó. Kết luận Lý giải Chuyển đổi một chuỗi JSON thành một đối tượng JavaScript tương ứng.
Câu 14:Khai báo biến với 'let' trong một vòng lặp 'for' có đặc điểm gì so với 'var'?
💡 Lời giải chi tiết:
Vì 'let' có phạm vi khối, mỗi lần lặp trong vòng lặp 'for' sẽ sở hữu một phiên bản biến riêng biệt, giúp tránh các lỗi logic về bất đồng bộ. Kết luận Lý giải Biến 'let' tạo ra một phạm vi khối mới cho mỗi lần lặp của vòng lặp.
Câu 15:Đối tượng 'Set' trong JavaScript dùng để lưu trữ dữ liệu theo quy tắc nào?
💡 Lời giải chi tiết:
Set là một cấu trúc dữ liệu tập hợp đặc biệt trong ES6, nơi mỗi giá trị (dù là nguyên thủy hay đối tượng) chỉ có thể xuất hiện một lần duy nhất. Kết luận Lý giải Chỉ lưu trữ các giá trị duy nhất, không cho phép trùng lặp.
Câu 16:Trong cơ chế Event Loop của JavaScript, 'Microtasks' (như Promise) được thực thi khi nào?
💡 Lời giải chi tiết:
Hàng đợi Microtask có độ ưu tiên cao hơn hàng đợi Task (Macrotask), nên chúng sẽ được xử lý hết ngay sau khi ngăn xếp lời gọi (call stack) trống. Kết luận Lý giải Sau khi mã đồng bộ thực hiện xong và trước khi bắt đầu một Macrotask mới.
Câu 17:Phương thức 'Object.freeze()' có tác dụng gì lên một đối tượng?
💡 Lời giải chi tiết:
Khi một đối tượng bị 'đóng băng', mọi nỗ lực thay đổi cấu trúc hoặc giá trị các thuộc tính của nó đều bị từ chối trong Strict Mode. Kết luận Lý giải Làm cho đối tượng không thể thay đổi: không thể thêm, xóa hoặc sửa đổi các thuộc tính hiện có.
Câu 18:Kết quả của biểu thức '[] + []' trong JavaScript là gì?
💡 Lời giải chi tiết:
Khi thực hiện phép cộng trên hai mảng, JavaScript sẽ chuyển đổi chúng thành chuỗi và nối lại với nhau, kết quả là hai chuỗi rỗng nối lại. Kết luận Lý giải Một chuỗi rỗng (empty string).
Câu 19:Toán tử 'spread' (...) khi áp dụng cho một mảng có tác dụng gì?
💡 Lời giải chi tiết:
Toán tử spread cho phép mở rộng một 'iterable' như mảng vào những nơi mà không hoặc nhiều đối số được mong đợi. Kết luận Lý giải Giải nén các phần tử của mảng vào một mảng mới hoặc danh sách đối số.
Câu 20:Làm thế nào để tạo một bản sao nông (shallow copy) của một đối tượng 'obj'?
💡 Lời giải chi tiết:
Sử dụng toán tử spread là cách phổ biến và ngắn gọn để tạo một đối tượng mới chứa tất cả các thuộc tính của đối tượng cũ. Kết luận Lý giải let copy = { ...obj };
Câu 21:Phương thức 'Array.prototype.reduce()' nhận vào bao nhiêu đối số chính?
💡 Lời giải chi tiết:
Phương thức reduce yêu cầu một hàm callback để thực hiện tích lũy và có thể nhận thêm một tham số thứ hai là giá trị bắt đầu cho bộ tích lũy. Kết luận Lý giải 2 (hàm callback và giá trị khởi tạo tùy chọn).
Hệ nhị phân không thể biểu diễn chính xác một số phân số thập phân như 0.1 hay 0.2, dẫn đến các sai số làm tròn khi thực hiện tính toán. Kết luận Lý giải Do giới hạn của việc biểu diễn số thực trong hệ nhị phân gây ra sai số nhỏ.
Câu 23:Trong JavaScript, 'Closure' là gì?
💡 Lời giải chi tiết:
Closure cho phép một hàm ghi nhớ và truy cập vào phạm vi của nó ngay cả khi hàm đó đang được thực thi bên ngoài phạm vi ban đầu. Kết luận Lý giải Sự kết hợp giữa một hàm và môi trường nơi hàm đó được khai báo, cho phép hàm truy cập biến từ phạm vi bên ngoài.
Câu 24:Hàm 'setTimeout(() => {}, 0)' thực hiện tác vụ gì?
💡 Lời giải chi tiết:
Dù thời gian chờ là 0ms, hàm vẫn được đưa vào Macrotask Queue và chỉ được thực thi sau khi toàn bộ mã đồng bộ hiện tại đã chạy xong. Kết luận Lý giải Đưa hàm vào hàng đợi tác vụ để thực thi sớm nhất có thể sau khi ngăn xếp hiện tại trống.
Câu 25:Cách đúng để kiểm tra một biến 'x' có phải là mảng hay không?
💡 Lời giải chi tiết:
Cả hai cách đều hợp lệ để kiểm tra mảng, nhưng 'Array.isArray' thường được ưu tiên hơn vì hoạt động chính xác ngay cả với các iframe khác nhau. Kết luận Lý giải Cả 'x instanceof Array' và 'Array.isArray(x)' đều đúng.