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ì?

js
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ì?

js
console.log([] + []);
console.log([] + {});
console.log({} + []);

Trả lời:

shell
""
"[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ì?

js
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ì?

js
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 ba tham chiếu cùng một vị trí trong bộ nhớ.

5. Kết quả là gì?

js
console.log('5' - 2);
console.log('5' + 2);

Trả lời:

shell
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ì?

js
console.log(false == '0');
console.log(false === '0');

Trả lời:

shell
true
false

Giả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ì?

js
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1000);
}

Trả lời:

shell
3
3
3

Giả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

js
console.log(typeof NaN);
console.log(NaN === NaN);

Trả lời:

shell
"number"
false

Giải thích:

  • typeof NaN trả về "number" vì NaN là một giá trị số không hợp lệ trong JavaScript.
  • NaN === NaN trả về false vì theo chuẩn IEEE 754, NaN không bao giờ bằng chính nó.

9. Hiệu quả của Object.freeze

js
const person = { name: "John" };
Object.freeze(person);
person.age = 30;
delete person.name;
console.log(person);

Trả lời:

shell
{ name: "John" }

Giải thích:

  • Object.freeze(person) ngăn chặn mọi thay đổi đối với object person.
  • Việc thêm thuộc tính age và xoá name đều không có hiệu lực.

10. Boolean conversion

js
console.log(!!"");
console.log(!!" ");
console.log(!!null);
console.log(!!undefined);

Trả lời:

shell
false
true
false
false

Giải thích:

  • !!"" trả về false vì chuỗi rỗng là giá trị falsy.
  • !!" " trả về true vì một chuỗi chứa khoảng trắng là giá trị truthy.
  • !!null!!undefined trả về false vì 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!