JavaScript là một ngôn ngữ linh hoạt nhưng cũng dẫn đến nhiều trường hợp khó hiểu và dễ gây nhầm lẫn. Bài viết này sẽ giúp bạn hiểu rõ hơn về cách JavaScript hoạt động thông qua 10 câu hỏi khó và giải thích chi tiết.
1. Kết quả của phép tính và so sánh này là gì?
console.log(0.1 + 0.2 === 0.3);Trả lời:
false
Giải thích:
Do cách JavaScript lưu trữ số dạng floating-point theo chuẩn IEEE 754, phép tính 0.1 + 0.2 không chính xác là 0.3, mà gần đúng là 0.30000000000000004.
2. Kết quả là gì?
console.log([] + []);
console.log([] + {});
console.log({} + []);Trả lời:
""
"[object Object]"
"[object Object]"Giải thích:
[] + []: Hai mảng rỗng khi đưa vào toán tử+được chuyển thành chuỗi, kết quả là"".[] + {}: Object khi chuyển sang chuỗi trả về[object Object].{}được xem như block code trống, nên{}+[]thành[object Object].
3. Kiểu dữ liệu của null là gì?
console.log(typeof null);Trả lời:
"object"
Giải thích:
Đây là lỗi trong JavaScript từ thời kỳ đầu và đã trở thành một phần của chuẩn ngôn ngữ.
4. Kết quả là gì?
let a = [1, 2, 3];
let b = a;
b.push(4);
console.log(a);Trả lời:
[1, 2, 3, 4]
Giải thích:
Trong JavaScript, mảng là kiểu tham chiếu, nên b và a tham chiếu cùng một vị trí trong bộ nhớ.
5. Kết quả là gì?
console.log('5' - 2);
console.log('5' + 2);Trả lời:
3
"52"Giải thích:
-ép chuỗi"5"thành số.+giữ chuỗi và nối chuỗi thay vì cộng số.
6. Kết quả là gì?
console.log(false == '0');
console.log(false === '0');Trả lời:
true
falseGiải thích:
== so sánh giá trị sau khi chuyển đổi, trong khi === kiểm tra cả kiểu dữ liệu.
7. Kết quả là gì?
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}Trả lời:
3
3
3Giải thích:
Do var không có block scope nên giá trị i được thay đổi sau vòng lặp.
8. Kiểu dữ liệu và so sánh NaN
console.log(typeof NaN);
console.log(NaN === NaN);Trả lời:
"number"
falseGiải thích:
typeof NaNtrả về "number" vì NaN là một giá trị số không hợp lệ trong JavaScript.NaN === NaNtrả vềfalsevì theo chuẩn IEEE 754, NaN không bao giờ bằng chính nó.
9. Hiệu quả của Object.freeze
const person = { name: "John" };
Object.freeze(person);
person.age = 30;
delete person.name;
console.log(person);Trả lời:
{ name: "John" }Giải thích:
Object.freeze(person)ngăn chặn mọi thay đổi đối với objectperson.- Việc thêm thuộc tính
agevà xoánameđều không có hiệu lực.
10. Boolean conversion
console.log(!!"");
console.log(!!" ");
console.log(!!null);
console.log(!!undefined);Trả lời:
false
true
false
falseGiải thích:
!!""trả vềfalsevì chuỗi rỗng là giá trị falsy.!!" "trả vềtruevì một chuỗi chứa khoảng trắng là giá trị truthy.!!nullvà!!undefinedtrả vềfalsevì cả hai đều là giá trị falsy.
Kết Luận
Những câu hỏi trên minh họa và giải thích những khái niệm quan trọng về JavaScript. Hiểu rõ những trường hợp này sẽ giúp bạn tránh những lỗi sai và viết code tốt hơn!









