The following ES6 language features are supported by esdown:
Modules allow you to structure your code in separate files. Read the Module Guide for more information.
Instead of using var
to declare variables, you can now use let
and const
. Unlike
var
, block-scoped varaibles do not "hoist" to the top of the function body. They
are only visible within the block in which they are defined.
Arrow functions
are a more concise way to write function expressions. Arrow functions close over
the parent function's this
variable.
paths.forEach(path => {
FS.readFile(path).then(data => {
// do something with the data
});
});
numbers.map(number => number + 43);
Classes are syntactic sugar for creating object-oriented abstractions in Javascript.
class C {
// "constructor" initializes the new object
constructor() {
this.snakesOnPlane = 3;
}
// "static" methods are attached to the constructor function
static foo() {
return "foo";
}
}
Template strings are strings with super-powers.
// Template strings support interpolation
var name = "Zen";
console.log(`hello, ${ name }`); // "hello, Zen"
// Template strings can span multiple lines
var embeddedText = `
at the age old pond
a frog leaps into water
a deep resonance
`;
// You can customize the processing with tagged template strings
console.log(String.raw`\u0064`); // "\\u0064"
Spread syntax allows you to inject arrays into function calls and array literals.
var array = [1, 2, 3];
// Spreading into a function call
f(...array);
// Spreading into an array literal
var longer = [0, ...array, 4]; // [0, 1, 2, 3, 4]
Rest arguments allow you to pull out the "rest" of the arguments to a function as an array.
function f(a, ...args) {
console.log(f);
console.log(args);
}
f(1, 2, 3, 4);
// >>> 1
// >>> [2, 3, 4]
You can now assign a default to a function parameter. The default will be used if the
argument is not supplied, or if the argument's value is undefined
.
function f(a = "foo") {
return a;
}
f(); // "foo"
f(undefined); // "foo"
f("bar"); // "bar"
With destructuring syntax, you can "unpack" values from arrays, iterables, and objects.
Array destructuring:
var array = [1, 2, 3];
// Unpacking an array
var [a, b] = array;
console.log(a, b); // 1, 2
// Assignment forms also work:
array = [3, 4];
[a, b] = array;
console.log(a, b); // 3, 4
// Unpacking the "rest"
var rest;
array = [1, 2, 3, 4, 5];
[a, b, ...rest] = array;
console.log(a, b, rest); // 1, 2, [3, 4, 5]
// Providing default values
[a, b = 43] = [1];
console.log(a, b); // 1, 43
Object destructuring:
// Unpacking an object
var obj = { a: 1, b: 2, c: 3 };
var { a, b, c: cc } = obj;
console.log(a, b, cc); // 1, 2, 3
// Assignment forms also work (but might need parenthesis!)
({ a, b }) = obj;
console.log(a, b); // 1, 2
Function arguments can also be destructured:
function f({ foo, bar }) {
console.log(foo, bar);
}
f({ foo: "foo", bar: "bar" });
// Logs:
// >>> "foo", "bar"
Computed properties allow you to use dynamic property names in an object literal.
var name = "esdown";
var obj = {
[name]: "The best ES6->ES5 compiler on the market"
};
You can leave off the property name in an object literal if the value is a simple variable.
var a = "foo";
var obj = { a };
console.log(a); // { "a": "foo" }
Methods are a shorter way to assign a function to an object literal property.
var obj = {
doSomething() {
// Do something
}
};
For-of statements loop over iterators.
var list = [1, 2, 3];
for (var item of list)
console.log(item);
// Logs:
// >>> 1
// >>> 2
// >>> 3
var map = new Map();
map.set("foo", 1);
map.set("bar", 2);
for (var key of map.keys())
console.log(key);
// Logs:
// >>> "foo"
// >>> "bar"
Custom iterators can be defined for any object using Symbol.iterator
:
class C {
constructor() {
this.list = [1, 2, 3];
}
[Symbol.iterator]() {
// Delegate to the list's iterator
return this.list[Symbol.iterator]();
}
}
var c = new C();
for (var item of c)
console.log(item);
// Logs:
// >>> 1
// >>> 2
// >>> 3
Map and Set are new built-in standard library collection classes.
A Promise represents the result of an asynchronous action.
Object:
- Object.assign
- Object.is
String:
- String.fromCodePoint
- String.prototype.codePointAt
- String.prototype.contains
- String.prototype.startsWith
- String.prototype.endsWith
- String.prototype.repeat
Array:
- Array.from
- Array.of
- Array.prototype.copyWithin
- Array.prototype.fill
- Array.prototype.find
- Array.prototype.findIndex
- Array.prototype.entries
- Array.prototype.keys
- Array.prototype.values
Other:
The following ES6 features are not translated by esdown. You can still use these features if your JS engine supports them.
- Generators (To translate generator functions, you can use regenerator on code that has been processed by esdown.)
- Math extras
- Proxies
- Reflect namespace
- Dynamic module loading