Phiên bản mới của Javascript đã ra đời được một thời gian rồi, mình cũng có làm qua nhưng chưa thực sự chú ý nhiều, chủ yếu vẫn viết theo kiểu cũ. Nay mình mới đọc lại một số tài liệu, hướng dẫn và tống hợp lại những chức năng thú vị của ES6.
Template string
Với chức năng này ta có thể tạo một bản mẫu cho chuỗi cho phép ta nhúng các biểu thức vào, và cũng có thể viết trên nhiều dòng. Chú ý là ta sẽ dùng dấu ` chứ không phải dấu ‘, dấu này ở ngay dưới phím Esc trên bàn phím.
Cách dùng
1 | var country = 'vietnam'; |
Kết quả
1 | Xin chao vietnam |
Destructuring assignment (Tách và gán)
Tách và gán là mình tự dịch ra thôi, chức năng này cho phép ta trích xuất dữ liệu từ mảng hoặc đối tượng gán vào các biến riêng lẽ.
Cách dùng
1 | var arr = [1, 2, 3]; |
Lấy kết quả trả về từ hàm
1 | function getTop2() { |
Gán cho một biến khác tên với thuộc tính của đổi tượng
1 | var obj = {name: 'thach', age: 27}; |
Block scope với let
let cho phép ta tạo ra một biến được giới hạn trong phạm vi của block chứa nó. let khác với var ở chỗ, var tạo ra một biến có phạm vi toàn cục hoặc xuyên suốt một hàm. Để rõ hơn thì mình coi qua ví dụ so sánh giữa let và var.
1 | if (true) { |
Như ta thấy ở ví dụ trên, biến b chỉ có thể dùng trong if-block mà không thể dùng bên ngoài được. Bây giờ ta tiếp tục ví dụ với hàm.
1 | function varFunc() { |
Khi ta let y = 2 bên trong if-block nó tạo ra một biến y mới không liên quan gì đến let y = 1 ở trên cả. cho nên sau if-block, y bên ngoài không bị thay đổi.
Dùng let với bất đồng bộ
Hãy xem ví dụ sau:
1 | for (var i = 0; i < 3; i ++) { |
Nếu ta dùng var ở trên, sau khi 3 vòng lặp thực hiện xong, 3 dòng console.log bên trong setTimeout sẽ được thực thi, khi đó in ra giá trị i lúc này đã là 3 rồi, cho nên ta có 3 nội dung var 3 giống nhau.
Tuy nhiên nếu dùng let như ở dưới, mỗi vòng lặp tạo ra một biến i không liên quan gì đến nhau, cho nên ta có 3 nội dung in ra khác nhau.
Vì vậy, ta thấy dùng let sẽ giúp cho code rõ ràng hơn trong trường hợp này, tránh phải sai lầm không mong muốn.
Const
Coi về let rồi thì tranh thủ coi về const 1 chút luôn. const giúp ta định nghĩa một biến với giá trị không thể thay đổi.
1 | const a = 'foo'; |
Class
Khi trước để tạo một giả class trong js ta sẽ dùng function, như thế này:
1 | function Person() { |
Nay với ES6, ta có class, giúp ta có thể tạo lớp, đối tượng, làm việc với kế thừa một cách đơn giản hơn.
1 | class Person { |
Tạo một class con với extends
Để tạo một class con của một class ta dùng extends.
1 | class Teacher extends Person { |
Nếu trong lớp con có constructor thì ta phải gọi phương thức super() trước khi sử dụng this.
1 | class Student extends Person { |
Arrow functions
Một cách viết hàm mới, ngắn gọn hơn.
Dưới đây là ví dụ so sánh giữa cách viết cũ và mới.
1 | // ES5 |
Nếu như hàm có nhiều tham số, và có nhiều dòng lệnh hơn thì ta viết đầy đủ thế này:
1 | [1,2,3].map((num, index) => { |
Trả về một object
Chú ý nếu muốn trả về một object ta không chỉ đơn giản dùng { key: value } được.
1 | var func1 = () => { name: 'saysua' }; |
Lỗi ở đây là do, ở giữa cặp dấu ngoặc nhọn {} code sẽ được hiểu là một chuỗi các câu lệnh. Như ở func1, name được hiểu là 1 label chứ không phải là một key của object. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label)
Ta viết lại cho đúng như sau:
1 | var func1 = () => ({ name: 'saysua' }); |
Arrow function không tự động bind this
Nếu ở ES5 ta tạo một hàm mới, nó sẽ luôn tự tạo ra một giá trị this vì vậy code dưới đây sẽ chạy bị sai.
1 | function Runner() { |
Ta sẽ thường xử lý bằng cách gán một biến that = this hoặc là bind(this) vào hàm bên trong.
1 | function Runner() { |
Còn arrow function không tự động tạo giá trị this nên đoạn code sau sẽ chạy đúng như ta mong muốn.
1 | function Runner() { |
Tuy nhiên, chính vì đặc tính này mà bạn cần phải chú ý khi sử dụng arrow function trong một số trường hợp, ví dụ:
1 | var sum = { |
Tổng kết
Mình thấy những tính năng mới của ES6 rất thú vị, giúp viết code nhanh và vui hơn, vẫn còn nhiều tính năng mới nữa nhưng mình chưa tìm hiểu hết được. Tuy nhiên một vài trường hợp cần phải sử dụng cẩn thận, kẻo nhanh quá lại hóa sai, không kiểm soát được các giá trị. Happy codding!