🌞

Hồi 4: ES6 căn bản - Rest Parameters và Spread Operator

Sửa bài viết này

Trong Series này

  1. Nâng cấp cho Object
  2. Arrow function
  3. Assignment Destruction
  4. Rest parameters và spread operator
  5. Template literals
  6. Khai báo biến với let và const
  7. 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...