ES6 mang lại rất nhiều tính năng hay cho Javascript. Trong bài viết này hãy cùng mình tìm hiểu những tính năng có thể giúp chúng ta viết code hiệu quả hơn. Bài viết dành cho những người đang tìm hiểu JS như mình.
ECMAScript, hay ES6, được xuất bản vào tháng 6 năm 2015. Sau đó nó được đổi tên thành ECMAScript 2015.
1. Const và let
Trước khi có ES6, để khai báo biến chúng ta sử dụng từ khóa var
.
Tuy nhiên nó lại gặp vấn đề liên quan tới scope. Vì var
không có block scope cho nên dẫn tới trường hợp không như mong muốn, ví dụ:
1 2 3 4 5 6 | <span class="token keyword">var</span> company <span class="token operator">=</span> <span class="token string">'Sun Asterisk'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> company <span class="token operator">=</span> <span class="token string">'Framgia'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>company<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Framgia</span> |
Chúng ta sẽ gặp vấn đề trong những dự án lớn với hàng ngàn dòng code, chúng ta không biết company
đã được khai báo trước đó, do đó nếu khai báo lại biến cùng tên đó trong câu lệnh if thì không may sẽ dẫn tới việc thay đổi giá trị của biến company trong global scope.
Đó là lý do mà chúng ta sẽ thay thế bằng let
và const
, ví dụ trên sẽ hoạt động đúng như sau:
1 2 3 4 5 6 | <span class="token keyword">let</span> company <span class="token operator">=</span> <span class="token string">'Sun Asterisk'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> company <span class="token operator">=</span> <span class="token string">'Framgia'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>company<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Sun Asterisk</span> |
Bây giờ nếu định nghĩa cùng tên biến thì cũng không gặp vấn đề gì vì company
đã ở trong 2 scope khác nhau.
2. Arrow function
Ngày nay, các ngôn ngữ lập trình hiện đại đều có xu hướng đơn giản hóa cách viết nhưng vẫn đáp ứng được nhiệm vụ. Arrow function ra đời cũng giúp việc viết code ngắn gọn hơn.
Trước khi có arrow function, chúng ta thường viết như sau:
1 2 3 4 5 6 | <span class="token keyword">function</span> <span class="token function">sayGreeting</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">sayGreeting</span><span class="token punctuation">(</span><span class="token string">'Sunner'</span><span class="token punctuation">)</span> |
Với arrow function:
1 2 3 4 | <span class="token keyword">function</span> <span class="token function-variable function">sayGreeting</span> <span class="token operator">=</span> <span class="token parameter">name</span> <span class="token operator">=></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">)</span> <span class="token function">sayGreeting</span><span class="token punctuation">(</span><span class="token string">'Sunner'</span><span class="token punctuation">)</span> |
3. Tham số “Rest”
Cùng xem ví dụ sau:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">function</span> <span class="token function">something</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token operator">...</span> numbers</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"a: "</span><span class="token punctuation">,</span> a<span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"b: "</span><span class="token punctuation">,</span> b<span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"numbers: "</span><span class="token punctuation">,</span> numbers<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">something</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token comment">// a: 1</span> <span class="token comment">// b: 2</span> <span class="token comment">// numbers: [3, 5]</span> |
Có thể thấy tiền tố … của tham số cuối cùng sẽ được chứa trong một mảng, numbers
được gọi là rest parameter
4. Template literals
Template literals là chuỗi mà bạn có thể ngắt dòng và sử dụng với interpolated expression (tạm dịch: biểu thức nội suy), kiểu ${variable_name}
.
Để tạo template literals chúng ta dùng dấu (thay vì ” hay “” như string thông thường)
Ví dụ:
1 2 3 | <span class="token keyword">const</span> name <span class="token operator">=</span> <span class="token string">"Sunner"</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">We are </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>sunner<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> |
5. Promises
Promises cho phép bạn dừng lại một hàm này cho tới khi các hàm trước đó được thực hiện xong, được sử dụng khi chúng ta xử lý một chuỗi các hành động theo trình tự.
Khi chưa có Promise thì chúng ta sử dụng callback nhưng callback có nhiều hạn chế nên không ai ưa dùng.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token comment">// add two numbers remotely using observable</span> <span class="token keyword">let</span> resultA<span class="token punctuation">,</span> resultB<span class="token punctuation">,</span> resultC<span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">addAsync</span><span class="token punctuation">(</span><span class="token parameter">num1<span class="token punctuation">,</span> num2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// use ES6 fetch API, which return a promise</span> <span class="token comment">// What is .json()? https://developer.mozilla.org/en-US/docs/Web/API/Body/json</span> <span class="token keyword">return</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">http://www.example.com?num1=</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>num1<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&num2=</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>num2<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">x</span> <span class="token operator">=></span> x<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">addAsync</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token punctuation">{</span> resultA <span class="token operator">=</span> success<span class="token punctuation">;</span> <span class="token keyword">return</span> resultA<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token function">addAsync</span><span class="token punctuation">(</span>success<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token punctuation">{</span> resultB <span class="token operator">=</span> success<span class="token punctuation">;</span> <span class="token keyword">return</span> resultB<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token function">addAsync</span><span class="token punctuation">(</span>success<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token punctuation">{</span> resultC <span class="token operator">=</span> success<span class="token punctuation">;</span> <span class="token keyword">return</span> resultC<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">success</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'total: '</span> <span class="token operator">+</span> success<span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>resultA<span class="token punctuation">,</span> resultB<span class="token punctuation">,</span> resultC<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Xem thêm tại đây:
- https://developer.mozilla.org/vi/docs/Web/JavaScript/Reference/Global_Objects/Promise
- https://www.digitalocean.com/community/tutorials/javascript-promises-for-dummies
6. Tham số mặc định
Tham số mặc định trong Javascript cho phép chúng ta khởi tạo giá trị ban đầu cho tham số đầu vào của hàm nếu chúng ta gọi hàm đó mà không truyền đối số hoặc undefined.
Ví dụ nếu chúng ta không truyền đối số cho hàm sayGreeting
, nó sẽ undefined
1 2 3 4 | <span class="token keyword">function</span> <span class="token function-variable function">sayGreeting</span> <span class="token operator">=</span> <span class="token parameter">name</span> <span class="token operator">=></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">)</span> <span class="token function">sayGreeting</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// Hello undefined</span> |
Với ES6 chúng ta có thể đặt giá trị mặc định cho tham số đầu vào như thế này:
1 2 3 4 | <span class="token keyword">function</span> sayGreeting <span class="token operator">=</span> <span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">"Sunner"</span><span class="token punctuation">)</span> <span class="token operator">=></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">)</span> <span class="token function">sayGreeting</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// Hello Sunner</span> |
7. Modules
Khi viết code chúng ta thường có những hàm với chức năng/mục đích cụ thể, những hàm liên quan này chúng ta tách ra … được gọi là module.
Ví dụ chúng ta có module tính toán với các hàm cộng, trừ chẳng hạn, ví dụ:
1 2 3 4 5 6 7 8 9 | <span class="token comment">// calculation.js</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">+</span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">sub</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">-</span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Chúng ta sử dụng từ khóa export
để “chìa ra” cho các file khác có thể import
vào để sử dụng, ví dụ:
1 2 3 4 5 6 | <span class="token comment">// main.js</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> add<span class="token punctuation">,</span> sub <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./calculation.js'</span><span class="token punctuation">;</span> <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 3</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token function">sub</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1</span> |
8. Destructuring
Xem qua ví dụ dưới cùng mình nha:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'Sunner'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">19</span><span class="token punctuation">,</span> address<span class="token operator">:</span> <span class="token string">'16 Ly Thuong Kiet St'</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> name <span class="token operator">=</span> user<span class="token punctuation">.</span>name <span class="token keyword">let</span> age <span class="token operator">=</span> user<span class="token punctuation">.</span>age <span class="token keyword">let</span> address <span class="token operator">=</span> user<span class="token punctuation">.</span>address |
Có thể thấy là với object user ở trên và mình muốn tạo biến để lưu từng giá trị ở trong đó thì phải viết lại user.
khá mất thời gian.
Với destructuring
thì chúng ta có thể làm như sau:
1 2 | <span class="token keyword">let</span> <span class="token punctuation">{</span> name<span class="token punctuation">,</span> age<span class="token punctuation">,</span> address <span class="token punctuation">}</span> <span class="token operator">=</span> user |
Nếu muốn đổi tên biến name thành username, chúng ta làm như sau:
1 2 3 4 | <span class="token keyword">let</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> username<span class="token punctuation">,</span> age<span class="token punctuation">,</span> address <span class="token punctuation">}</span> <span class="token operator">=</span> user console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>username<span class="token punctuation">)</span> <span class="token comment">// Sunner</span> |
Đơn giản hơn đúng không.
Destructuring cho phép chúng ta trích xuất các phần của object hoặc array.
9. Class
Trước ES6, JS không có class nên chúng ta thường dùng hàm kiểu thế này.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">function</span> <span class="token function">Person</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token class-name">Person</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">introduce</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">My name is </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">'Dot'</span><span class="token punctuation">)</span> person<span class="token punctuation">.</span><span class="token function">introduce</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Với ES6, chúng ta có thể viết rõ ràng hơn, dễ hiểu hơn cho những ai đã biết các ngôn ngữ như C#, Java …
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">introduce</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">My name is </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span>‘Dot’<span class="token punctuation">)</span><span class="token punctuation">;</span> person<span class="token punctuation">.</span><span class="token function">introduce</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Ngoài ra còn thêm các tính năng hay ho của ES6 nữa như Proxy, Symbol … bạn có thể tìm hiểu thêm ở đây https://github.com/lukehoban/es6features
Trên đây không phải là tất cả tính năng của ES6 mà chỉ là một số tính năng hay và hữu ích đối với mình. Nếu bạn biết tính năng nào hay thì comment cho mình học hỏi thêm với nhea
Cảm ơn bạn đã dành thời gian đọc bài.