278 lines
4.4 KiB
Markdown
278 lines
4.4 KiB
Markdown
# Features
|
|
|
|
## Abstract references ([experimental](usage.md#experimental)) ([spec](https://github.com/zenparsing/es-abstract-refs))
|
|
|
|
```javascript
|
|
foo::bar;
|
|
foo::bar = baz;
|
|
delete foo::bar;
|
|
```
|
|
|
|
## Array comprehensions ([experimental](usage.md#experimental))
|
|
|
|
```javascript
|
|
var results = [for (c of customers) if (c.city == "Seattle") { name: c.name, age: c.age }]
|
|
```
|
|
|
|
## Arrow functions
|
|
|
|
```javascript
|
|
// Expression bodies
|
|
var odds = evens.map(v => v + 1);
|
|
var nums = evens.map((v, i) => v + i);
|
|
|
|
// Statement bodies
|
|
nums.forEach(v => {
|
|
if (v % 5 === 0)
|
|
fives.push(v);
|
|
});
|
|
|
|
// Lexical this
|
|
var bob = {
|
|
_name: "Bob",
|
|
_friends: [],
|
|
printFriends() {
|
|
this._friends.forEach(f => {
|
|
console.log(this._name + " knows " + f);
|
|
});
|
|
}
|
|
};
|
|
```
|
|
|
|
## Async functions ([experimental](usage.md#experimental)) ([spec](https://github.com/lukehoban/ecmascript-asyncawait))
|
|
|
|
```javascript
|
|
async function chainAnimationsAsync(elem, animations) {
|
|
for (var anim of animations) {
|
|
await anim(elem);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Classes
|
|
|
|
```javascript
|
|
class SkinnedMesh extends THREE.Mesh {
|
|
constructor(geometry, materials) {
|
|
super(geometry, materials);
|
|
|
|
this.idMatrix = SkinnedMesh.defaultMatrix();
|
|
this.bones = [];
|
|
this.boneMatrices = [];
|
|
//...
|
|
}
|
|
|
|
update(camera) {
|
|
//...
|
|
super.update();
|
|
}
|
|
|
|
static defaultMatrix() {
|
|
return new THREE.Matrix4();
|
|
}
|
|
}
|
|
```
|
|
|
|
## Computed property names
|
|
|
|
```javascript
|
|
var foo = "foo";
|
|
var bar = "bar";
|
|
var obj = {
|
|
["foo" + bar]: "heh",
|
|
["bar" + foo]: "noo",
|
|
foo: "foo",
|
|
bar: "bar"
|
|
};
|
|
```
|
|
|
|
## Constants
|
|
|
|
```javascript
|
|
const MULTIPLIER = 5;
|
|
console.log(2 * MULTIPLIER);
|
|
|
|
MULTIPLIER = 6; // error
|
|
var MULTIPLIER; // error
|
|
```
|
|
|
|
## Default parameters
|
|
|
|
```javascript
|
|
function f(x, y = 12) {
|
|
// y is 12 if not passed (or passed as undefined)
|
|
return x + y;
|
|
}
|
|
f(3) == 15
|
|
```
|
|
|
|
## Destructuring
|
|
|
|
```javascript
|
|
// list matching
|
|
var [a, , b] = [1,2,3];
|
|
|
|
// object matching
|
|
var { op: a, lhs: { op: b }, rhs: c } = getASTNode();
|
|
|
|
// object matching shorthand
|
|
// binds `op`, `lhs` and `rhs` in scope
|
|
var { op, lhs, rhs } = getASTNode();
|
|
|
|
// Can be used in parameter position
|
|
function g({ name: x }) {
|
|
console.log(x);
|
|
}
|
|
g({ name: 5 });
|
|
|
|
// Fail-soft destructuring
|
|
var [a] = [];
|
|
a === undefined;
|
|
```
|
|
|
|
## Exponentiation operator ([experimental](usage.md#experimental)) ([spec](https://github.com/rwaldron/exponentiation-operator))
|
|
|
|
```javascript
|
|
var a = 2;
|
|
a **= 2;
|
|
|
|
var squared = 2 ** 2;
|
|
```
|
|
|
|
## For-of
|
|
|
|
```javascript
|
|
for (var i of [1, 2, 3]) {
|
|
console.log(i * i);
|
|
}
|
|
```
|
|
|
|
## Generators
|
|
|
|
```javascript
|
|
function* fibonacci() {
|
|
var pre = 0, cur = 1;
|
|
for (;;) {
|
|
var temp = pre;
|
|
pre = cur;
|
|
cur += temp;
|
|
yield cur;
|
|
}
|
|
}
|
|
|
|
for (var n of fibonacci()) {
|
|
// truncate the sequence at 1000
|
|
if (n > 1000) break;
|
|
console.log(n);
|
|
}
|
|
```
|
|
|
|
## Generator comprehensions ([experimental](usage.md#experimental))
|
|
|
|
```javascript
|
|
var nums = [1, 2, 3, 4, 5, 6];
|
|
var multiples = (for (i of nums) if (i % 2) i * i);
|
|
assert.equal(multiples.next().value, 1);
|
|
assert.equal(multiples.next().value, 9);
|
|
assert.equal(multiples.next().value, 25);
|
|
```
|
|
|
|
## Let scoping
|
|
|
|
```javascript
|
|
for (let i in arr) {
|
|
let v = arr[i];
|
|
}
|
|
```
|
|
|
|
## Modules
|
|
|
|
```javascript
|
|
import "foo";
|
|
import foo from "foo";
|
|
import * as foo from "foo";
|
|
import {bar} from "foo";
|
|
import {foo as bar} from "foo";
|
|
|
|
export { test };
|
|
export var test = 5;
|
|
export function test() {}
|
|
|
|
export default test;
|
|
```
|
|
|
|
## Numeric literals
|
|
|
|
```javascript
|
|
0b111110111 === 503; // true
|
|
0o767 === 503; // true
|
|
```
|
|
|
|
## Object spread/rest ([experimental](usage.md#experimental)) ([spec](https://github.com/sebmarkbage/ecmascript-rest-spread))
|
|
|
|
```javascript
|
|
var n = { x, y, ...z };
|
|
var { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
|
|
```
|
|
|
|
## Property method assignment
|
|
|
|
```javascript
|
|
var obj = {
|
|
foo() {
|
|
return "foobar";
|
|
},
|
|
|
|
get bar() {
|
|
return this._bar;
|
|
},
|
|
|
|
set bar(val) {
|
|
this._bar = val;
|
|
}
|
|
};
|
|
```
|
|
|
|
## Property name shorthand
|
|
|
|
```javascript
|
|
function f(x, y) {
|
|
return { x, y };
|
|
}
|
|
```
|
|
|
|
## Rest parameters
|
|
|
|
```javascript
|
|
function f(x, ...y) {
|
|
// y is an Array
|
|
return x * y.length;
|
|
}
|
|
f(3, "hello", true) == 6
|
|
```
|
|
|
|
## Spread
|
|
|
|
```javascript
|
|
function f(x, y, z) {
|
|
return x + y + z;
|
|
}
|
|
// Pass each elem of array as argument
|
|
f(...[1,2,3]) == 6
|
|
```
|
|
|
|
## Template literals
|
|
|
|
```javascript
|
|
var x = 5;
|
|
var y = 10;
|
|
console.log(`${x} + ${y} = ${x + y}`); // "5 + 10 = 15"
|
|
```
|
|
## Unicode regex
|
|
|
|
```javascript
|
|
var string = 'foo💩bar';
|
|
var match = string.match(/foo(.)bar/u);
|
|
console.log(match[1]);
|
|
```
|