Bug xảy ra khi giá trị hợp lệ lại là falsy. || trả về vế phải với mọi falsy: 0, '', false, NaN, null, undefined.
Còn ?? chỉ trả vế phải khi vế trái là null hoặc undefined.
js
const input = { limit: 0, keyword: '', showAds: false };
input.limit || 20; // 20 — sai, user cố ý truyền 0
input.limit ?? 20; // 0 — đúng
input.keyword || 'all'; // 'all' — sai, user cố ý xoá trắng ô tìm kiếm
input.showAds ?? true; // false — đúng, giữ lựa chọn tắt quảng cáoTrường hợp thực tế hay dính: cờ bật/tắt (false bị hiểu là chưa set), số lượng/giá 0, chuỗi rỗng khi người dùng xoá input, page = 0.
Ba lưu ý:
- ?? không thay thế || trong mọi trường hợp: nếu bạn thật sự muốn chuỗi rỗng rơi về mặc định thì || mới đúng.
- Không được trộn ?? với &&/|| mà không có ngoặc — a || b ?? c là SyntaxError, phải viết (a || b) ?? c.
- Default trong destructuring (function f({ limit = 20 })) hoạt động giống ?? chứ không giống || — chỉ áp dụng khi giá trị là undefined.