Rest Parameters
ES6. Đại diện nhiều argument thành array. Ký hiệu ... trước tham số.
Arguments Object
Object built-in trong function (non-arrow), đại diện tất cả arguments truyền vào. Array-like (có length, index) nhưng không phải Array.
Sự khác biệt chính
| Đặc điểm | Arguments Object | Rest Parameters |
|---|---|---|
| Phạm vi | Tất cả arguments truyền vào | Chỉ các argument không có tên riêng (sau các named params) |
| Kiểu dữ liệu | Array-like object (không phải Array) | Array thật (instanceof Array = true) |
| Methods | Không có .map, .filter, .forEach... phải dùng Array.from() | Có đầy đủ Array methods |
| Arrow function | Không có arguments object | Hoạt động bình thường |
| Cú pháp | Tự động có sẵn | Phải khai báo explicit: function(...rest) |
| this binding | Không liên quan | Không liên quan |
Ví dụ so sánh
function demo(a, b, ...rest) {
console.log("a:", a); // named param
console.log("b:", b); // named param
console.log("rest:", rest); // Array [3, 4, 5]
console.log("arguments:", arguments); // Array-like {0:1, 1:2, 2:3, 3:4, 4:5, length:5}
// rest dùng được Array methods
console.log(rest.map(x => x * 2)); // [6, 8, 10]
// arguments phải convert
console.log(Array.from(arguments).map(x => x * 2)); // [2, 4, 6, 8, 10]
}
demo(1, 2, 3, 4, 5);
// Arrow function - không có arguments
const arrow = (...rest) => {
// arguments ở đây là của outer scope (nếu có) hoặc ReferenceError
console.log(rest); // OK
};
Best Practice
- Ưu tiên Rest Parameters (ES6): Array thật, dùng được methods, rõ ràng intent, tương thích arrow function.
- Tránh
argumentstrừ khi maintain legacy code hoặc cần truy cập tất cả args bao gồm named params. - Trong arrow function: chỉ dùng rest parameters.