1. String padding
The purpose of string padding is to add characters to the string so that it can reach a certain length .
ES2017 brings two new methods for String
: padStart()
and padEnd()
.
1 2 3 | <span class="token function">padStart</span> <span class="token punctuation">(</span> targetLength <span class="token punctuation">[</span> <span class="token punctuation">,</span> padString <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> targetLength <span class="token punctuation">[</span> <span class="token punctuation">,</span> padString <span class="token punctuation">]</span> <span class="token punctuation">)</span> |
Example of usage:
1 2 3 4 5 6 7 8 9 10 | <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token comment">// " test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">6</span> <span class="token punctuation">)</span> <span class="token comment">// " test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">7</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "abctest"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">8</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "abcdtest"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">9</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "abcdatest"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padStart</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> |
1 2 3 4 5 6 7 8 9 10 | <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token comment">// "test "</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">6</span> <span class="token punctuation">)</span> <span class="token comment">// "test "</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">7</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "testabc"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">8</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "testabcd"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">9</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "testabcda"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> <span class="token string">'test'</span> <span class="token punctuation">.</span> <span class="token function">padEnd</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">'abcd'</span> <span class="token punctuation">)</span> <span class="token comment">// "test"</span> |
2. Object.values ()
This method returns an array containing all the attribute values of the object itself.
Use:
1 2 3 | <span class="token keyword">const</span> person <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'Tung'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">16</span> <span class="token punctuation">}</span> Object <span class="token punctuation">.</span> <span class="token function">values</span> <span class="token punctuation">(</span> person <span class="token punctuation">)</span> <span class="token comment">// ['Tung', 16]</span> |
Object.values()
can also be used with arrays:
1 2 3 | <span class="token keyword">const</span> person <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'Tung'</span> <span class="token punctuation">,</span> <span class="token number">16</span> <span class="token punctuation">]</span> Object <span class="token punctuation">.</span> <span class="token function">values</span> <span class="token punctuation">(</span> person <span class="token punctuation">)</span> <span class="token comment">// ['Tung', 16]</span> |
3. Object.entries ()
This method returns an array containing the properties of the object as an array of [key, value]
pairs.
Use:
1 2 3 | <span class="token keyword">const</span> person <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'Tung'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">16</span> <span class="token punctuation">}</span> Object <span class="token punctuation">.</span> <span class="token function">entries</span> <span class="token punctuation">(</span> person <span class="token punctuation">)</span> <span class="token comment">// [["name", "Tung"], ["age", 16]]</span> |
Object.entries()
can also be used with arrays:
1 2 3 | <span class="token keyword">const</span> person <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'Tung'</span> <span class="token punctuation">,</span> <span class="token number">16</span> <span class="token punctuation">]</span> Object <span class="token punctuation">.</span> <span class="token function">entries</span> <span class="token punctuation">(</span> person <span class="token punctuation">)</span> <span class="token comment">// [["0", "Tung"], ["1", 16]]</span> |
4. Object.getOwnPropertyDescriptors ()
This method accepts an object and returns an object containing all descriptions of (non-inherited) properties of the object passed.
Any object in JavaScript has properties and each of these properties has a descriptor.
A descriptor is a set of “properties of an attribute” including:
- value: value of the attribute
- writable: indicates whether the value of the property can be changed or not
- get: a getter function for the property (
undefined
if none) - set: a setter function for the attribute (
undefined
if none) - configurable: shows whether or not the property descriptor can be changed, whether or not the property can be deleted from the object.
- enumerable: Indicates whether the attribute appears when listing the properties of the object
What is the application of this method?
In ES6 we have Object.assign()
that can copy all enumerable properties from one or more objects and return a new object.
However, the problem is that because Object.assign()
only reads the value of the attribute and then saves it to the object assigned as a simple data attribute, for example when an object has only a setter, it will not work. Copy to the new object if using Object.assign()
.
For example with:
1 2 3 4 5 6 | <span class="token keyword">const</span> person1 <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">set</span> <span class="token function">name</span> <span class="token punctuation">(</span> newName <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> newName <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
The result is:
And when person1
to a new object:
1 2 3 | <span class="token keyword">const</span> person2 <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> Object <span class="token punctuation">.</span> <span class="token function">assign</span> <span class="token punctuation">(</span> person2 <span class="token punctuation">,</span> person1 <span class="token punctuation">)</span> |
we will get: But if we do the following, we can copy the setter:
1 2 3 4 | <span class="token keyword">const</span> person3 <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> Object <span class="token punctuation">.</span> <span class="token function">defineProperties</span> <span class="token punctuation">(</span> person3 <span class="token punctuation">,</span> Object <span class="token punctuation">.</span> <span class="token function">getOwnPropertyDescriptors</span> <span class="token punctuation">(</span> person1 <span class="token punctuation">)</span> <span class="token punctuation">)</span> |
You can simply test it on the console as follows:
1 2 3 4 5 6 7 8 | person1 <span class="token punctuation">.</span> name <span class="token operator">=</span> <span class="token string">'x'</span> x person2 <span class="token punctuation">.</span> name <span class="token operator">=</span> <span class="token string">'x'</span> person3 <span class="token punctuation">.</span> name <span class="token operator">=</span> <span class="token string">'x'</span> x |
Because person2
not copy setter, there will be no log of name.
We will have the same problem when copying objects with Object.create()
.
5. Last comma
This feature allows us to add the last comma when defining the function or when calling the function (previously only able to add the last comma to arrays and objects):
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> <span class="token function-variable function">doSomething</span> <span class="token operator">=</span> <span class="token punctuation">(</span> var1 <span class="token punctuation">,</span> var2 <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> <span class="token function">doSomething</span> <span class="token punctuation">(</span> <span class="token string">'test1'</span> <span class="token punctuation">,</span> <span class="token string">'test2'</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> |
This feature is useful when we want to add new elements, parameters or attributes … You just need to add new lines without having to edit the old ones. This makes it easier to keep track of changes between versions of the code, as well as to eliminate the need to write code with commas at the beginning of a line.
6. Async function
Javascript has evolved very quickly from callbacks to promises (ES2015), and since ES2017, asynchronous JavaScript has become simpler with the async / await syntax.
The async function is a combination of promise and generator. It is basically a higher level of abstraction of promises and async / await is built from promises .
Why asynce / await was created
When promises were introduced in ES2015, the meaning was to solve asynchronous code problems and to solve them. However, during the two years from ES2015 to ES2017, it became clear that promises are not the last resort.
The Promise offered to solve the emerging problem is that there are too many nested callbacks, but it also leads to additional complications from itself as well as syntax complexity.
Promise is a primitive from which the programmer can see the syntax better. So finally we get the async function from the promise.
The Async function makes the code look like it is synchronous but actually behind it is asynchronous.
How to operate
For example, we have an async function that returns a promise like this:
1 2 3 4 5 6 | <span class="token keyword">const</span> <span class="token function-variable function">doSomethingAsync</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> resolve <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'I did something'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">3000</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
When you call this function, add await
to the front of the function and the code will stop until the promise is resolved or rejected . However, it should be noted that: the call must be defined with async
. For example:
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> doSomething <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</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">'Before'</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 keyword">await</span> <span class="token function">doSomethingAsync</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 string">'After'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">doSomething</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
Result:
1 2 3 4 | Before <span class="token constant">I</span> did something <span class="token comment">// sau 3s</span> After |
Async functions always promise
Adding keyword async
in front of any function will cause that function to return a promise.
Although there is no need to declare a promise, actually inside the function will still return a promise.
So this code snippet:
1 2 3 4 5 6 | <span class="token keyword">const</span> aFunction <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">'test'</span> <span class="token punctuation">}</span> <span class="token function">aFunction</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> alert <span class="token punctuation">)</span> |
would be similar to:
1 2 3 4 5 6 | <span class="token keyword">const</span> aFunction <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> Promise <span class="token punctuation">.</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'test'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">aFunction</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> alert <span class="token punctuation">)</span> |
Async function in sequence
The async function can be joined together very easily and its syntax is much easier to read than using promises simply:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">const</span> <span class="token function-variable function">promiseToDoSomething</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> resolve <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">"I did something"</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">10000</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> waitingForSomethingToBeDone <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> something <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">promiseToDoSomething</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> something <span class="token operator">+</span> <span class="token string">" and I'm waiting"</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> stillWaitingForSomethingToBeDone <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> something <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">waitingForSomethingToBeDone</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> something <span class="token operator">+</span> <span class="token string">" and I'm still waiting"</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 keyword">await</span> <span class="token function">stillWaitingForSomethingToBeDone</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// I did something and I'm waiting and I'm still waiting</span> |
7. Shared Memory and Atomics
WebWorkers are used to create multithreaded programs in the browser.
It provides a messaging protocol through events. Since ES2017, you can create a shared memory array between web workers and their creators using SharedArrayBuffer
.
Because it is unclear how much time it takes to write to shared memory, Atomics has appeared to be able to ensure that when reading a value, the writing operation has been completed.
More details on this feature you can read at all recommended spec this .
Above are the ES2017 features. You can read more about ES2018 features in the next article .