ECMAScript 2016 Approved
The new JavaScript standard ECMAScript 2016 is now officially approved!
Every year each new proposal to ECMAScript which reaches Stage 4 will be added to the standard. Stage 4 basically means, that the specification text is written down and has at least two major implementations (or browsers in this case).
In the new standard, two new features have been added.
Let's take a look at those two features.
Array.prototype.includes
Array.prototype.includes
is a convenience method for Array
, if you want to know if a certain value is in an Array
you can now use it in favor of Array.prototype.indexOf
. One main difference to Array.prototype.indexOf
is, Array.prototype.includes
can find the value NaN
and Array.prototype.indexOf
does not. The includes
method has also been added to all TypedArray
objects.
Examples:
> [ 1, 2, 3, 4].includes(3)
true
> [ 1, 2, 3, 4].includes(0)
false
This makes constructs like the following a bit more readable:
if (myArray.indexOf(5) > -1) {
// has 5
}
// or
if (myArray.indexOf(5) !== -1) {
// has 5
}
versus:
if (myArray.includes(5)) {
// has 5
}
Example of difference between indexOf
and includes
with NaN
:
> [ NaN ].indexOf(NaN)
-1
> [ NaN ].includes(NaN)
true
The Exponentiation Operator
Exponentiation is commonly used in mathematics and physics and can now be expressed with the operator **
in ECMAScript 2016. Very similar to Pythons **
.
So instead of
Math.pow(3, 4)
we can now write
3 ** 4
Additionally we can use the assignment form too, similar to +=
for numbers or strings.
> let n = 3
> n **= 4
> n
81
The **
operator has higher precedence than *
which means:
> 2 * 2 ** 3
16
> 2 * (2 ** 3)
16
> (2 * 2) ** 3
64
Currently, negative number literals cannot be the base of the exponentiation and will throw a syntax error.
> -5 ** 2
Uncaught SyntaxError: Unexpected token **
A look into the future
With ECMAScript 2016 finalized, there has already been progress on ECMAScript 2017 and several futures have already been finalized:
Object.values/Object.entries
Two new functions have been added to Object
both will aid you in iterating over object properties.
Similar to Object.keys
which gives you own enumerable keys, Object.values
will give you own enumerable object values.
Example:
> Object.values({ keyA: 'a', keyB: 'b', keyC: 'c' })
[ 'a', 'b', 'c' ]
Easy object value iteration:
let obj = { keyA: 'a', keyB: 'b', keyC: 'c' }
for (let value of Object.values(obj)) {
console.log(value)
}
// logs 'a', 'b' and 'c'
Object.entries
gives you an Array
of key/value pairs.
> Object.entries({ keyA: 'a', keyB: 'b', keyC: 'c' })
[ [ 'keyA', 'a' ], [ 'keyB', 'b' ], [ 'keyC', 'c' ] ]
This may look rather weird but makes it very easy to iterate over an object with key and value using destructuring like this:
let obj = { keyA: 'a', keyB: 'b', keyC: 'c' }
for (let [ key, value ] of Object.entries(obj)) {
console.log(key, value)
}
// logs 'keyA a', 'keyB b' and 'keyC c'
String padding
A very common problem is string padding, especially in command line interfaces and number formating. ECMAScript 2017 will provide two new String
methods to help you.
String.prototype.padStart
String.prototype.padEnd
The methods are called padStart
and padEnd
because it will recognize left-to-right and right-to-left languages and pad the string accordingly.
> '1'.padStart(5)
" 1"
> '1'.padStart(5, '0')
"00005"
> '1'.padEnd(5)
"1 "
> '1'.padEnd(5, '0')
"50000"
Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors
will get all property descriptors of an object, very similar to Object.getOwnPropertyDescriptor
which gets a single property descriptor. This means, we can get all property definitions of an object and can copy these over to another object (you wouldn't be able to "get" a getter or setter property using the dot or bracket notation).
Example of making a shallow copy of an object:
let objectCopy = Object.create(
Object.getPrototypeOf(object),
Object.getOwnPropertyDescriptors(object)
)
That's it for now, I hope you are as excited as me about all the new ECMAScript features which make the language better and more powerful every year! :)