Преобразует код из ES-2015 в ES5 ES5 поддерживается везде
Легко добавляется в состав системы сборки frontend'a (Gulp, Grunt, Webpack ...)
Область видимости переменной let — блок {}
function showApplesCount() {
    var apples = 5;
    if (true) {
        var apples = 10;
        alert(apples); // 10
    }
    alert(apples); // 10
}
                function showApplesCount() {
    let apples = 5; // (*)
    if (true) {
        let apples = 10;
        alert(apples); // 10
    }
    alert(apples); // 5
}
                let видна только после объявления
alert(a); // undefined var a = 5;
alert(a); // ReferenceError let a = 5;
for(var i=0; i<10; i++) {
    /* … */
}
alert(i); // 10
                for(let i=0; i<10; i++) {
    /* … */
}
alert(i); // i is not defined
                Задаёт константу, которую нельзя менять
const apple = 5; apple = 10; // ошибка
Особый синтаксис присваивания, при котором можно присвоить массив или объект сразу нескольким переменным, разбив его на части
var coord = [150, 200]; var x = coord[0]; var y = coord[1]; alert(x); // 150 alert(y); // 200
let [x, y] = [150, 200]; alert(x); // 150 alert(y); // 200
let [first, last, ...rest] = "Юлий Цезарь Император Рима".split(" ")
alert(first); // Юлий
alert(last);  // Цезарь
alert(rest);  // ["Император", "Рима"]
            let [first='First', last] = []; alert(first); // First alert(last); // undefined
let {var1, var2} = {var1:…, var2:…}
let options = {
    title: "Меню",
    width: 100,
    height: 200
};
let {title, width = 0, height:h} = options;
alert(title);  // Меню
alert(width);  // 100
alert(h); // 200
            var value = 'value';
var str = 'some string with ' + value + ' and ' +
    'multiline'
                Обратные кавычки ``
alert(`моя многострочная строка`);
let apples = 2;
let oranges = 3;
alert(`Sum of: ${apples} + ${oranges} = ${apples + oranges}`);
// Sum of  2 + 3 = 5
                    Параметры по умолчанию
function func(title = "Title", width = getWidth(), height = 200) {
    alert(`${title} ${width} ${height}`);
}
func("Меню"); // Меню 100 200
            Оператор spread вместо arguments
function showName(firstName, lastName, ...rest) {
    alert(`${firstName} ${lastName} - ${rest}`);
}
showName("Юлий", "Цезарь", "Император", "Рима");
// Юлий Цезарь - Император,Рима
            Деструктуризация в параметрах
let options = {
    title: "Меню",
    width: 100,
    height: 200
};
function showMenu({title, width, height}) {
    alert(`${title} ${width} ${height}`); // Меню 100 200
}
showMenu(options);
            Свойство name
function f() {}
f.name === "f" // true
                    Стрелочный синтаксис
var positive = numbers.filter(function(num) {
    return num > 0
});
                var positive = numbers.filter(num => num > 0);
Короткое свойство
let name = "Вася";
let isAdmin = true;
let user = {
    name,
    isAdmin
};
alert( JSON.stringify(user) );
// {"name": "Вася", "isAdmin": true}
                Вычисляемые свойства
let propName = "firstName";
let user = {
    [propName]: "Вася"
};
                Методы объекта
let name = "Вася";
let user = {
    name,
    // вместо "sayHi: function()
    sayHi() {
        alert(this.name);
    }
};
user.sayHi(); // Вася
                __proto__ и super
let animal = {
    walk() {
        alert("I'm walking");
    }
};
let rabbit = {
    __proto__: animal,
    walk() {
        super.walk(); // I'm walking
    }
};
rabbit.walk();
                Синтаксис
class Название [extends Родитель]  {
    constructor
    методы
}
                class User {
    constructor(name) {
        this.name = name;
    }
    sayHi() {
        alert(this.name);
    }
}
let user = new User("Вася");
user.sayHi(); // Вася
            Геттеры и сеттеры
class User {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
   }
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    }
    set fullName(newValue) {
        [this.firstName, this.lastName] = newValue.split(' ');
    }
}
let user = new User("Вася", "Пупкин");
alert( user.fullName ); // Вася Пупков
user.fullName = "Иван Петров";
alert( user.fullName ); // Иван Петров
            Статические свойства
class User {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    static createGuest() {
      return new User("Гость", "Сайта");
    }
};
let user = User.createGuest();
            Наследование
class Animal {
  constructor(name) {
    this.name = name;
  }
  walk() {
    alert(`${this.name} walk`);
  }
}
                class Rabbit extends Animal {
    walk() {
        super.walk();
        alert("...and jump!");
    }
}
new Rabbit("Вася").walk();
                private и protected свойства
Ключевое слово export можно ставить:
export let one = 1;
let one = 1;
let two = 2;
export {one as once, two as twice};
                    import {one, two} from "./nums";
            Object. Ключ - только строка
Map. Ключ - произвольный тип
let map = new Map([
    ['string',  'str1'],
    [1,    'num1']
]);
map.set(true, 'bool1');
map.size() // 3
            Для итерации используются:
let recipeMap = new Map([
    ['огурцы', '500 гр'],
    ['помидоры', '300гр'],
]);
for(let key of recipeMap.keys()) {
    alert(key); // огурцы, помидоры
}
for(let amount of recipeMap.values()) {
    alert(amount); // 500 гр, 350 гр
}
for(let entry of recipeMap)
    alert(entry); // ['огурцы', '500 гр'] ...
}
            Коллекция множества уникальных значений
let set = new Set();
let vasya = {name: "Вася"};
let petya = {name: "Петя"};
let dasha = {name: "Даша"};
set.add(vasya);
set.add(petya);
set.add(dasha);
set.add(vasya);
set.add(petya);
alert( set.size ); // 3
set.forEach( user => alert(user.name ) ); // Вася, Петя, Даша
            Ограничения:
let activeUsers = [
    {name: "Vasia"},
    {name: "Petia"},
    {name: "Masha"}
];
let weakMap = new WeakMap();
weakMap.set(activeUsers[0], 1);
weakMap.set(activeUsers[1], 2);
weakMap.set(activeUsers[2], 3);
alert( weakMap.get(activeUsers[0]) ); // 1
activeUsers.splice(0, 1); // в weakMap теперь только 2 элемента
activeUsers.splice(0, 1); // в weakMap теперь только 1 элемент
            20 лет назад
for (var index = 0; index < myArray.length; index++) {
    console.log(myArray[index]);
}
            ES5
myArray.forEach(function (value) {
    console.log(value);
});
for (var index in myArray) {    // bad
    console.log(myArray[index]);
}
            ES6
for (var value of myArray) {
    console.log(value);
}
                Плюсы
Callback-hell
Синтаксис
var promise = new Promise(function(resolve, reject) {
// В ней можно делать любые асинхронные операции,
// А когда они завершатся — нужно вызвать одно из:
// resolve(результат) при успешном выполнении
// reject(ошибка) при ошибке
})
promise.then(onFulfilled, onRejected)
            Пример
let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("result"), 1000);
});
promise.then(
    result => {
        alert("Fulfilled: " + result); // result - аргумент resolve
    },
    error => {
        alert("Rejected: " + error); // error - аргумент reject
    }
);
            Цепочки
httpGet('/article/promise/user.json')
  // 1. Получить данные о пользователе в JSON и передать дальше
  .then(response => {
    let user = JSON.parse(response);
    return user;
  })
  // 2. Получить информацию с github
  .then(user => {
    return httpGet(`https://api.github.com/users/${user.name}`);
  })
  // 3. Вывести аватар
  .then(githubUser => {
    githubUser = JSON.parse(githubUser);
    let img = new Image();
    img.src = githubUser.avatar_url;
    document.body.appendChild(img);
  })
  .catch(error => {
    alert(error);
  });
            Новый вид функций.
Могут приостанавливать своё выполнение, возвращать промежуточный результат и далее возобновлять его позже, в произвольный момент времени
function* generateSequence() {
    yield 1;
    yield 2;
    return 3;
}
let generator = generateSequence();
let one = generator.next(); // {value: 1, done: false}
let two = generator.next(); // {value: 2, done: false}
let three = generator.next(); // {value: 3, done: true}
            Пример: Написание "плоского" асинхронного кода.
Пример: Написание "плоского" асинхронного кода.
function* showUserAvatar() {
  let user = yield fetch('/article/generator/user.json');
  let githubUser = yield fetch(`https://api.github.com/users/${user.name}`)
  return githubUser.avatar_url;
}
function execute(generator, yieldValue, callback) {
  let next = generator.next(yieldValue);
  if (!next.done) {
    next.value.then(
      result => execute(generator, result, callback),
      err => generator.throw(err)
    );
  } else {
    callback(next.value);
  }
}
execute( showUserAvatar(), null, callback );