Trong Series này
- Nâng cấp cho Object
- Arrow function
- Assignment Destruction
- Rest parameters và spread operator
- Template literals
- Khai báo biến với let và const
- Căn bản class
Mục lục
- Rest parameter
- Spread Operator
Rest parameter
Khi số lượng tham số truyền vào cho một function không cố định, chúng ta có thể sử dụng arguments
, sau đó sử dụng Array.prototype.slice.call
để chuyển nó thành một mảng
var print() {
var list = Array.prototype.slice.call(arguments)
console.log(list)
}
print('a','b','c')
// -> ['a','b','c']
Với ES6, chúng ta có một cách làm khác, thêm dấu "..." phía trước tham số
var print(...list) {
console.log(list)
}
print('a','b','c')
// -> ['a','b','c']
Nếu muốn truyền vào 1 tham số bình thường
var print(first,...list) {
console.log(first)
console.log(list)
}
print('a','b','c')
// -> 'a'
// -> ['b','c']
Nếu lúc trước ta phải viết
function sumAll(){
var numbers = Array.prototype.slice.call(arguments)
return numbers.reduce( function (a,b){
return a + b
})
}
// =8
Nếu sử dụng Arrow function thì buộc phải thêm dấu ngoặc kép ()
, dù chỉ có một tham số
var sumAll = ( ...numbers ) => numbers.reduce((total,next) => total + next)
console.log( sumAll(1,2,5))
// = 8
Spread Operator
Xem ví dụ bên dưới, Spread operator giúp trả về một mảng
function cast() {
return [...arguments]
}
cast('a','b','c')
// ['a','b','c']
Trong trường hợp phải kết hợp nhiều mảng
var all = [ 1, ...[2,3], 4, ...[5],6,7]
console.log(all)
// [1,2,3,4,5,6,7]
Một ví dụ khác để thấy lợi ích của spread operator khi kết hợp với new một object
như Date
new Date( ...[2015,11,31] )
// Thu Dec 31 2015
Khi muốn lấy 1 hoặc 2 phần tử của mảng, cách vẫn thường làm là shift mấy phần tử này
var list = [ 'a','b','c','d' ]
var first = list.shift()
var second = list.shift()
console.log(first)
// a
Cách viết mới
var [first, second, ...rest] = [ 'a','b','c','d','e' ]
// ['c','d','e']
Initializing...