11/10/2019, 10:10

Tham chiếu và ghi chú ngắn về ES6, ESNext

ECMAScript Tên chính thức của Javascript Tài liệu chuẩn hóa Javascript Thường được gọi tắt là ES ES6 ES6 là gì? Bản đặc tả ECMAScript phiên bản 6. Đặc tả tức là bản mô tả chức năng, cú pháp, còn việc có hỗ trợ hay không là phụ thuộc vào phiên bản của từng platform ...

ECMAScript

  • Tên chính thức của Javascript
  • Tài liệu chuẩn hóa Javascript
  • Thường được gọi tắt là ES

ES6

ES6 là gì?

  • Bản đặc tả ECMAScript phiên bản 6. Đặc tả tức là bản mô tả chức năng, cú pháp, còn việc có hỗ trợ hay không là phụ thuộc vào phiên bản của từng platform (browser, node.js, babel transpiler,…)
  • Ra đời vào năm 2015 nên còn được gọi là ES2015
  • Là phiên bản nâng cấp lớn của ES5 ra đời vào năm 2009
  • 6 năm cho một lần release là quá lâu và số lượng feature mới cũng là quá nhiều mà chưa có platform nào implement được đầy đủ [1],[2]. Do đó quy trình release đã được thay đổi. Các phiên bản tiếp theo được release theo từng năm và theo quy trình mở [3],[4].
  • Có thể chia ra thành các phiên bản: ES6, ES 2016+ (ES7, ES8, ES9, ES10…) và ES Next (là những chức năng mới sắp được release [5])
  • Vì thường có yêu cầu phải support nhiều phiên bản trình duyệt khác nhau nên chúng ta thường phải sử dụng các transpiler (chẳng hạn babel, swc) để translate ra cú pháp mà support được các browser cũ, do đó khi đọc bảng compatibility table [1] nên chú ý đến cột Babel + core-js

Tham khảo thêm:

  • [1] https://kangax.github.io/compat-table/es6/
  • [2] https://node.green/
  • [3] https://kipalog.com/posts/Tim-hieu-quy-trinh-TC39
  • [4] http://2ality.com/2015/11/tc39-process.html
  • [5] https://github.com/tc39/proposals/blob/master/finished-proposals.md

let, const

ES6 giới thiệu 2 từ khóa mới là let và const dùng để khai báo biến, trước đây chỉ có var.

Khác với var

Các biến được khai báo với var có phạm vi function scope, còn với let, const thì nó phạm vi block scope

  • function scope: Biến được khai báo dùng được trong toàn bộ function

     
  • block scope: Biến được khai báo chỉ sử dụng được trong block {} nơi mà nó được khai báo

    Hoặc đối với biến trong vòng for:

let vs const

  • let: biến đã khai báo có thể được gán lại
  • const: biến đã khai báo không thể được gán lại

    Tuy nhiên nếu const là object thì giá trị của object vẫn có thể bị thay đổi. Chỉ không thể bị gán thành object khác mà thôi.

Từ đây trở đi chúng ta sẽ chủ yếu dùng let và const.

Template strings

ES6 giới thiệu thêm việc khai báo string bằng ký tự ` (backtick), bổ sung cho ' và ".

Dùng backtick ta có thể khai báo multiline string:

Thay cho trước đây:

Có thể dùng biến hoặc biểu thức JS trong string (String interpolation):

Class

Cú pháp khá giống với các ngôn ngữ class based OOP như PHP hoặc Java.

Class trong ES6 support kế thừa, super (parent) calls, instance method, static methods and constructor.

Constructor

Instance method

Static method

Getter & Setter

ES6 class support define các getter, setter cho các property của object. Cho phép chúng ta custom logic khi đọc/ghi giá trị của property, chẳng hạn validate, biến đổi giá trị…

Nhìn vào class có thể nhầm lẫn name() là một instance method, nhưng ở đây nó là method đặc biệt, chúng ta không thể gọi trực tiếp method này mà từ tên method => tên property.

Inheritance

Class fields

ES vẫn chưa chính thức support việc khai báo private/public property của object class, tính năng này vẫn đang còn được thảo luận (Proposal Stage 3).