1. So Sánh Trong JavaScript
Strict Comparison (===): So sánh cả giá trị và kiểu dữ liệu, không cho phép ép kiểu.
10 === '10'; // false
Abstract Comparison (==): So sánh chỉ giá trị, thực hiện chuyển đổi kiểu dữ liệu nếu cần.
10 == '10'; // true
2. Callback Function
Là hàm được truyền dưới dạng đối số và thực thi khi hàm gọi nó hoàn thành công việc.
function doTask(task, callback) {
console.log(`Bắt đầu ${task}`);
callback();
}
doTask('lập trình', () => console.log('Hoàn thành!'));
3. Kiểu Dữ Liệu Nguyên Thủy (Primitive)
Các kiểu dữ liệu nguyên thủy trong JavaScript bao gồm:
Boolean, Null, Undefined, Number, String, Symbol.
typeof 10; // "number"
typeof null; // "object"
4. Toán Tử Logic
&&: Trả về giá trị falsy đầu tiên, hoặc giá trị cuối cùng nếu không có giá trị falsy.
||: Trả về giá trị truthy đầu tiên, hoặc giá trị cuối cùng nếu không có giá trị truthy.
console.log(null && 'hello'); // null
console.log(undefined || 'mặc định'); // "mặc định"
5. Falsy và Truthy Values
Falsy values: 0, null, undefined, NaN, false, '' (chuỗi rỗng).
Truthy values: Mọi giá trị khác ngoài falsy.
6. Sự Khác Biệt Giữa undefined và null
undefined: Biến đã khai báo nhưng chưa có giá trị.
null: Đại diện cho giá trị "rỗng", có thể được gán.
let a;
console.log(a); // undefined
let b = null;
console.log(b); // null
7. IIFE (Immediately Invoked Function Expression)
Là hàm tự động được gọi ngay sau khi khai báo.
(function () {
console.log('IIFE được thực thi!');
})();
8. Promise và Trạng Thái
Promise có 3 trạng thái chính:
Pending: Chưa được xử lý.
Fulfilled: Đã thành công.
Rejected: Thất bại.
const promise = new Promise((resolve, reject) => {
resolve('Thành công');
});
promise.then(console.log); // "Thành công"
9. Higher-Order Functions
Là hàm nhận hoặc trả về một hàm khác. Ví dụ như các hàm map(), filter(), reduce().
const numbers = [1, 2, 3];
const squares = numbers.map(n => n * n); // [1, 4, 9]
10. Hoisting
JavaScript "kéo lên" các khai báo biến và hàm lên đầu phạm vi. Biến khai báo với var sẽ bị hoisted, nhưng không phải let và const.
console.log(x); // undefined
var x = 5;
11. Event Delegation
Phương pháp gắn sự kiện vào phần tử cha để xử lý sự kiện của các phần tử con.
document.querySelector('#parent').addEventListener('click', (event) => {
if (event.target.tagName === 'BUTTON') {
console.log('Nút bấm đã được nhấn!');
}
});
12. Class trong JavaScript
Class là khuôn mẫu để tạo đối tượng và bao gồm các phương thức.
class Car {
constructor(brand) {
this.brand = brand;
}
display() {
return `Xe này là ${this.brand}`;
}
}
const myCar = new Car('Toyota');
console.log(myCar.display()); // "Xe này là Toyota"
13. Currying
Là kỹ thuật biến một hàm nhận nhiều tham số thành một chuỗi các hàm nhận từng tham số một.
function add(a) {
return function (b) {
return a + b;
};
}
console.log(add(2)(3)); // 5
14. AJAX
AJAX (Asynchronous JavaScript and XML) cho phép gửi và nhận dữ liệu từ máy chủ mà không cần tải lại trang.
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));
15. LocalStorage và SessionStorage
LocalStorage: Lưu trữ dữ liệu lâu dài (không có thời gian hết hạn).
SessionStorage: Dữ liệu tồn tại trong phiên duyệt web hiện tại.
localStorage.setItem('key', 'value');
console.log(localStorage.getItem('key')); // "value"
Lưu ý bổ sung
Arrow Functions: Cách viết ngắn gọn cho các hàm trong JavaScript, đặc biệt là khi sử dụng trong các hàm callback.
const add = (a, b) => a + b;
Destructuring: Cách tiện lợi để trích xuất giá trị từ mảng hoặc đối tượng.
const [a, b] = [1, 2];
console.log(a, b); // 1, 2
const person = { name: 'John', age: 30 };
const { name, age } = person;
console.log(name, age); // John, 30