...args gom mọi tham số còn lại thành một Array thật.
javascript
function sum(...nums) {
return nums.reduce((a, b) => a + b, 0) // reduce dùng được ngay
}
sum(1, 2, 3) // 6
function log(level, ...rest) {
console.log(level, rest) // rest chỉ chứa phần CHƯA được đặt tên
}
log('info', 'a', 'b') // 'info' ['a', 'b']So với arguments:
...rest | arguments | |
|---|---|---|
| Kiểu | Array thật | array-like, phải Array.from() |
| Nội dung | chỉ phần chưa đặt tên | toàn bộ tham số |
| Trong arrow function | có | không |
| Đặt tên được | có | không |
javascript
function old() {
arguments.map(x => x) // TypeError — không phải Array
Array.from(arguments).map(...) // phải chuyển trước
}
const arrow = (...args) => args.map(x => x) // chạy đượcĐừng nhầm rest với spread — cùng ký hiệu ... nhưng ngược chiều:
javascript
const f = (...args) => args // rest: "thu lại"
f(...[1, 2, 3]) // spread: "mở ra"Lưu ý: rest phải là tham số cuối cùng. function f(a, ...rest, b) {} là lỗi cú pháp, không phải lỗi lúc chạy.