🔵 Phần 3: Kiến thức Nâng Cao – ES6+ và Tối ưu
Dưới đây là đáp án chi tiết cho phần 🔵 Phần 3: Kiến thức Nâng Cao – ES6+ và Tối ưu:
1. Destructuring là gì? Lấy ví dụ với object và array.
Destructuring là cú pháp giúp tách giá trị từ array hoặc object ra biến một cách nhanh chóng.
Với object:
const user = { name: 'Tài', age: 25 };
const { name, age } = user;
Với array:
const arr = [1, 2, 3];
const [a, b] = arr;
2. Spread và Rest operator khác nhau như thế nào?
...spread
Trích xuất phần tử
[...arr1, ...arr2]
...rest
Thu gọn phần còn lại
function(...args) {}
const arr = [1, 2, 3];
const newArr = [...arr, 4]; // spread
function sum(...nums) { // rest
return nums.reduce((a, b) => a + b);
}
3. Template literals (template strings) và cách sử dụng
Là cú pháp mới với dấu backtick (`) giúp chèn biến, viết chuỗi nhiều dòng dễ dàng.
const name = 'Tài';
const greet = `Hello, ${name}!
Welcome to JS.`;
4. Các kiểu import/export trong JavaScript module là gì?
Named export
export function a() {}
Default export
export default function() {}
Import named
import { a } from './file.js'
Import default
import abc from './file.js'
5. Set và Map là gì? Khác biệt so với Array/Object?
Set
Tập hợp giá trị duy nhất
Không có key, loại bỏ trùng lặp
Map
Cặp key-value, key có thể là object
Linh hoạt hơn object (key không giới hạn)
const set = new Set([1, 2, 2]); // => Set(2) {1, 2}
const map = new Map();
map.set('a', 1).set({}, 2);
6. Optional chaining và nullish coalescing (?.
, ??
) là gì?
?.
, ??
) là gì?Optional chaining (
?.
): giúp truy cập sâu mà không bị lỗi nếu thuộc tính không tồn tại.Nullish coalescing (
??
): trả về vế phải chỉ khi vế trái lànull
hoặcundefined
.
const user = {};
console.log(user.address?.city); // undefined, không lỗi
const val = null ?? 'default'; // => 'default'
7. Event loop và call stack trong JavaScript là gì?
Call stack: nơi chứa các hàm đang thực thi (ngăn xếp).
Event loop: kiểm tra stack trống để đưa các tác vụ async (callback, promise) từ queue/microtask vào stack.
🔁 Quy trình:
Call Stack trống? → Event loop đẩy từ queue → Stack
console.log(1);
setTimeout(() => console.log(2), 0);
console.log(3);
// Output: 1 → 3 → 2
8. Debounce và Throttle khác nhau như thế nào? Viết ví dụ đơn giản.
Debounce
Chỉ chạy sau khi ngừng gọi 1 khoảng thời gian
Tìm kiếm gợi ý khi nhập liệu
Throttle
Giới hạn tần suất gọi hàm
Cuộn trang, resize cửa sổ, scroll event
Debounce:
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
Throttle:
function throttle(fn, limit) {
let waiting = false;
return (...args) => {
if (!waiting) {
fn(...args);
waiting = true;
setTimeout(() => waiting = false, limit);
}
};
}
9. Deep clone và shallow clone là gì? Cách để clone object trong JS?
Shallow clone: clone cấp 1 (object con vẫn tham chiếu).
Deep clone: clone tất cả các cấp, không còn tham chiếu chung.
Shallow clone:
const copy = { ...original };
Deep clone:
const deep = JSON.parse(JSON.stringify(obj)); // đơn giản nhưng không clone được function, date
// Hoặc dùng thư viện:
import _ from 'lodash';
const deepCopy = _.cloneDeep(obj);
10. Memory leak là gì? Làm sao để tránh trong JavaScript?
Memory leak: bộ nhớ không còn dùng nhưng không được giải phóng → gây chậm hệ thống.
Nguyên nhân phổ biến:
Biến global không giải phóng
Listener không được remove
Closure giữ tham chiếu không cần thiết
Cách tránh:
Hủy listener khi không dùng:
element.removeEventListener('click', handler);
Tránh giữ tham chiếu lâu trong closure.
Sử dụng
WeakMap
,WeakSet
cho caching.
Last updated