SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
ECMAScript > Будущее

       Дмитрий Сошников
    http://dmitrysoshnikov.com
ECMAScript > ES6
let : Блочная область видимости
let : Блочная область видимости

// ES3


if (false) {
    var logLevel = 10;
}

alert(logLevel); // ?
let : Блочная область видимости

// ES3
var logLevel; // = undefined;

if (false) {                                 Все переменные создаются до
                                          запуска кода – при входе в контекст.
    logLevel = 10;
}                                             Так называемое «поднятие»
                                                 (hoisting) переменных.

alert(logLevel); // undefined


See: http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/
let : Блочная область видимости

// ES6 Harmony


if (false) {
    let logLevel = 10;
}

alert(logLevel); // ReferenceError
let : Блочная область видимости

// ES3, ES5

var handlers = [];
                                 handlers[0](); // ?
for (var k = 0; k < 3; k++) {    handlers[1](); // ?
   handlers[k] = function () {   handlers[2](); // ?
      alert(k);
   };
}
let : Блочная область видимости

// ES3, ES5

var handlers = [];
var k;                           handlers[0](); // 3
for (k = 0; k < 3; k++) {        handlers[1](); // 3
   handlers[k] = function () {   handlers[2](); // 3
      alert(k);
   };
}
let : Блочная область видимости

ES3, ES5                            ES6
for (var k = 0; k < 3; k++) {        for (let k = 0; k < 3; k++) {
   (function (x) {                      let x = k;
      handlers[x] = function () {   handlers[0]();=// 3
                                        handlers[x] function () {
         alert(x);                         alert(x);
                                    handlers[1](); // 3
      };                                };
                                    handlers[2](); // 3
   })(k);                            }
}

handlers[0](); // 0                 handlers[0](); // 0
let : Блочная область видимости

let x = 10;
                                       // let-объявление (definition)
let y = 20;

let (x = x * 2, y = 30) {
    console.log(x + y); // 50
                                       // let-инструкции (statement)
}

console.log(x + y); // 30

console.log(let (x = 100) x); // 100   // let-выражения (expression)
console.log(x); // 10
const : константы
const : константы



const MAX_SIZE = 100;

// нельзя перезаписать (let, var, etc.)
let MAX_SIZE = 100; // error
const : константные функции



const registerUser() {
  // реализация
}

// ошибка повторного объявления (function, let, var)
function registerUser() { ... }
Параметры по умолчанию
Параметры по умолчанию


function handleRequest(data, method) {
  method = method || “GET”;
  ...
}
Параметры по умолчанию


function handleRequest(data, method) {
  method = method || “GET”;
  ...
}

function handleRequest(data, method = “GET”) {
  ...
}
Деструктуризация или
«нестрогий pattern-matching»
Деструктуризация: массивы


// для массивов
let [x, y] = [10, 20, 30]; // нестрогий matching

console.log(x, y); // 10, 20
Деструктуризация: объекты


// for objects
let user = {name: “Ann”, location: {x: 10, y: 20}};

let {name: userName, location: {x: x, y: y}} = user;

console.log(userName, x, y); // “Ann”, 10, 20
Деструктуризация параметров функций


function Panel(config) {
  var title = config.title;
  var x = config.pos[0];              Слишком «шумно»
  var y = config.pos[1];
  return title + x + y;
}

new Panel({title: “Users”, pos: [10, 15]});
Деструктуризация параметров функций


function Panel({title: title, pos: [x, y]}) {
  return title + x + y;
}

let config = {title: “Users”, pos: [10, 15]};

new Panel(config);
Деструктуризация: обмен переменных


// обмен двух переменных без третьей?

let x = 10;
let y = 20;

[x, y] = [y, x]; // легко
Замена arguments:
 “rest” и “spread”
Объект arguments

// ES3, ES5

function format(pattern /*, rest */) {
  var rest = [].slice.call(arguments, 1);
  var items = rest.filter(function (x) { return x > 1});
  return pattern.replace(“%v”, items);
}

format(“scores: %v”, 1, 5, 3); // scores: 5, 3
Прощай, arguments

// ES3, ES5

function format(pattern /*, rest */) {
  var rest = [].slice.call(arguments, 1); // сложно
  var items = rest.filter(function (x) { return x > 1});
  return pattern.replace(“%v”, items);
}

format(“scores: %v”, 1, 5, 3); // scores: 5, 3
Привет, “rest”

// ES6 aka Harmony

function format(pattern, …rest) {     // настоящий массив
  var items = rest.filter(function (x) { return x > 1});
  return pattern.replace(“%v”, items);
}

format(“scores: %v”, 1, 5, 3); // scores: 5, 3
А также “spread”

// ES6 aka Harmony

function showUser(name, age, weight) {
  return name + “:” + age + weight;
}

let user = [“Alex”, 28, 130];

showUser(…user); // ok
showUser.apply(null, user); // desugared
“rest” массивов при деструктуризации

// ES6 aka Harmony

let userInfo = [“John”, 14, 21, 3];
let [name, ...scores] = userInfo;

console.log(name); // “John”
console.log(scores); // [14, 21, 3]
Сокращенные нотации
Сокращения в деструктуризации


let 3DPoint = {x: 20, y: 15, z: 1};

// полная нотация
let {x: x, y: y, z: z} = 3DPoint;

// сокращенная нотация
let {x, y, z} = 3DPoint;
Короткий синтаксис функций
                     -> функции

// обычная функция
[1, 2, 3].map(function (x) { return x * x; }); // [1, 4, 9]

// -> функция
[1, 2, 3].map((x) -> x * x); // [1, 4, 9]

Синтаксически:
   – опциональный return;
   – -> вместо function
   – Блочная скобки не обязательны
-> функции: примеры

// Пустая функция
let empty = ->;

// Скобки тела функции необязательны
let square= (x) -> x * x;

// Функция без параметров
let getUser = -> users[current];

// Для сложных выражений скобки нужны
let users = [{name: “Mark”, age: 28}, {name: “Sarah”, age: 26}];
users.forEach((user, k) -> { if (k > 2) console.log(user.name, k) });
Обычные функции: динамический this

function Account(customer, cart) {
  this.customer = customer;
  this.cart = cart;
  $(„#shopping-cart').on('click', function (event) {
      this.customer.purchase(this.cart); // error on click
  });
}                                               Решения:
                                             var that = this;
                                               .bind(this)
=> функции: лексический this

function Account(customer, cart) {
  this.customer = customer;
  this.cart = cart;
  $(„#shopping-cart').on('click', (event) =>
     this.customer.purchase(this.cart); // OK
  );
}
Но… Сейчас также функции-блоки
       на повестке дня!
Короткий синтаксис функций
                     функции-блоки

// обычная функция
[1, 2, 3].map(function (x) { return x * x; }); // [1, 4, 9]

// функция-блок
[1, 2, 3].map {|x| x * x}; // [1, 4, 9]

Синтаксически:
   – опциональный return;
   – |x| вместо function
   – Необязательные скобки вызова
Proxy объекты : мета уровень
Proxy-объекты

/* handler – обработчик мета-уровня
 * proto – прототип прокси-объекта */
Proxy.create(handler, [proto])

/* handler – мета-обработчик
 * call – проксирование вызова
 * construct – проксирование конструирования */
Proxy.createFunction(handler, [call, [construct]])

See: http://wiki.ecmascript.org/doku.php?id=harmony:proxies
Proxy-объекты
 // original object       // proxied object
 let point = {            let loggedPoint = Proxy.create({
    x: 10,                   get: function (rcvr, name) {
    y: 20                       console.log(“get: ”, name);
 };                             return point[name];
                             },
                             set: function (rcvr, name, value) {
Перехват чтения
   свойства                     console.log(“set: ”, name, value);
                                point[name] = value;
                             }
Перехват записи           }, Object.getPrototypeOf(point));
   свойства
Proxy-объекты
                                    // proxied object
  Мета-обработчик
                                    let loggedPoint = Proxy.create({
                                       get: function (rcvr, name) {
// перехват чтения                        console.log(“get: ”, name);
loggedPoint.x; // get: x, 10              return point[name];
                                       },
// перехват записи                     set: function (rcvr, name, value) {
loggedPoint.x = 20; // set: x, 20         console.log(“set: ”, name, value);
                                          point[name] = value;
// отражается на оригинале             }
point.x; // 20                      }, Object.getPrototypeOf(point));
Callable Proxy-объекты
// original object            // proxied object
let point = {x: 10, y: 20};   let loggedPoint = Proxy.createFunction({
                                 get: function (rcvr, name) {
                                    console.log(“get: ”, name);
function callTrap() {               return point[name];
  console.log(“call”);           },
}                                set: function (rcvr, name, value) {
                                    console.log(“set: ”, name, value);
function constructTrap() {
                                    point[name] = value;
  console.log(“construct”);
                                 }
}
                              }, callTrap, constructTrap);

loggedPoint(10, 20);
new loggedPoint(100);                                      Перехват
                                  Перехват вызова
                                                        конструирования
Proxy : простейший логгер на чтение
function logged(object) {
  return Proxy.create({
     get: function (rcvr, name) {
        console.log(“get:”, name);
        return object[name];
     }
  }, Object.getPrototypeOf(object));
}

let connector = logged({
    join: function (node) { ... }
});

connector.join(“store@master-node”); // get: join
Proxy : примеры

// логгеры (на чтение и запись)
Proxy.create(logHandler(object));

// множественное наследование (делегирующие примеси)
Proxy.create(mixin(obj1, obj2));

// noSuchMethod
Proxy.create(object, noSuchMethod)

// Массивы с негативными индексами (как в Python, Ruby)
let a = Array.new([1, 2, 3]);
console.log(a[-1]); // 3
a[-1] = 10; console.log(a); // [1, 2, 10]

See: https://github.com/DmitrySoshnikov/es-laboratory/tree/master/examples
Система модулей
Модули в ES3, ES5
var DBLayer = (function (global) {
   /* save original */
   var originalDBLayer = global.DBLayer;
   function noConflict() {                 1.   Создать локальный скоп
      global.DBLayer = originalDBLayer;    2.   Функция восстановления
                                           3.   Имплементация
   }
                                           4.   Публичный интерфейс
   /* implementation */
   function query() { ... }
   /* exports, public API */
   return {
      noConflict: noConflict,
      query: query
   };
})(this);
Модули в ES3, ES5
var DBLayer = (function (global) {
   /* save original */
   var originalDBLayer = global.DBLayer;
   function noConflict() {                 1.   Создать локальный скоп
      global.DBLayer = originalDBLayer;    2.   Функция восстановления
                                           3.   Имплементация
   }
                                           4.   Публичный интерфейс
   /* implementation */
   function query() { ... }
   /* exports, public API */
                                                 Слишком много
   return {                                 синтаксического «шума».
      noConflict: noConflict,                    Нужен «сахар»
      query: query
   };
})(this);
Модули в ES6
module DBLayer {
  export function query(s) { ... }
  export function connection(...args) { ... }
}

DBLayer.connection(”accounts/recent”);

import DBLayer.*; // импортируем все

import DBLayer.{query, connection: attachTo}; // только нужные экспорты

query(“SELECT * FROM books”).format(“escape | split”);

attachTo(“/books/store”, {
   onSuccess: function (response) { ... }
})
Внешние модули в ES6
// на файловой системе
module $ = require(“./library/selector.js”);

// глобально из сети; сами определяем имя модуля
module CanvasLib = require(“http:// ... /js-modules/canvas.js”);

// используем напрямую
let rect = new CanvasLib.Rectangle({width: 30, height: 40, shadow: true});

// или импортируем только нужные объекты
import CanvasLib.{Triangle, rotate};

rotate(-30, new Triangle($.query(...params)));
Деструктуризация и импорт внешних
                   модулей

// запрашиваем модуль и напрямую
// импортируем через pattern-matching
let {read, format} = require(“fs.js”);

// используем импортированные функции
read(“storage/accounts.dat”).format(“%line: value”)
Генераторы : итераторы и
кооперативная многозадачность
Генераторы : yield
                       «бесконечные» потоки
function fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
     [prev, curr] = [curr, prev + curr];
     yield curr;                                      Ручная итерация:
                                       Точка
                                  следующего входа   let seq = fibonacci();
    }
}                                                    seq.next(); // 1
                                                     seq.next(); // 2
for (let n in fibonacci()) {                         seq.next(); // 3
                                                     seq.next(); // 5
   // truncate the sequence at 1000
                                                     seq.next(); // 8
   if (n > 1000) break; // 1, 2, 3, 5, 8 ...
   console.log(n);
}
Генераторы : yield
                            кастомные итераторы
function iterator(object) {                   Предложенные итераторы ES6:
  for (let k in object) {
                                              // по свойствам (key+value)
    yield [k, object[k]];
                                              for (let [k, v] in properties(foo))
  }
}                                             // по значениям
                                              for (let v in values(foo))
let foo = {x: 10, y: 20};
                                              // по именам свойств
for (let [k, v] in iterator(foo)) {           for (let k in keys(foo))
  console.log(k, v); // x 10, y 20
}

See: http://wiki.ecmascript.org/doku.php?id=strawman:iterators
See: https://gist.github.com/865630
Генераторы: yield
             асинхронное программирование

Callback’и                                  Сопрограммы
xhr("data.json", function (data) {          new Task(function () {
    xhr("user.dat", function (user) {         let data = yield xhr("data.json“);
      xhr("user/save/", function (save) {     handlers[0](); // 3
                                              let user = yield xhr(“user.dat“);
          /* code */                          let save = yield xhr(“/user/save“);
                                              handlers[1](); // 3
      }                                       /* code */
                                              handlers[2](); // 3
    }                                       });
});

/* other code */                            /* other code */
Генераторы : yield
                кооперативная многозадачность
let thread1 = new Thread(function (...args) {
   for (let k in values([1, 2, 3])) yield k + “ from thread 1”;
}).start();

let thread2 = new Thread(function (...args) {
   for (let k in values([1, 2, 3])) yield k + “ from thread 2”;
}).start();

//   1 from   thread 1
//   2 from   thread 1
//   1 from   thread 2
//   3 from   thread 1
//   2 from   thread 2
//   etc.
Array comprehensions
Array comprehensions

// map + filter

let scores = [1, 7, 4, 9]
   .filter(function (x) { return x > 5 })
   .map(function (x) { return x * x }); // [49, 81]
Array comprehensions

// map + filter

let scores = [1, 7, 4, 9]
   .filter(function (x) { return x > 5 })
   .map(function (x) { return x * x }); // [49, 81]


// array comprehensions

let scores = [x * x for (x in values([1, 7, 4, 9])) if (x > 5)];
Спасибо за внимание


    Дмитрий Сошников

dmitry.soshnikov@gmail.com
http://dmitrysoshnikov.com

    @DmitrySoshnikov

Contenu connexe

Tendances

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовtvaleev
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScriptDmitry Soshnikov
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 

Tendances (20)

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Javascript
JavascriptJavascript
Javascript
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScript
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 

En vedette

Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJS
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24MoscowJS
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)mlatushko
 
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звука
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звукаКружок по робототехнике. Занятие #4. Программируем датчики касания и звука
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звукаAlexander Kolotov
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)Ontico
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraAllen Wirfs-Brock
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionMoscowJS
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptWojciech Dzikowski
 

En vedette (15)

Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
 
доклад
докладдоклад
доклад
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
 
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звука
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звукаКружок по робототехнике. Занятие #4. Программируем датчики касания и звука
Кружок по робототехнике. Занятие #4. Программируем датчики касания и звука
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in action
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern Javascript
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 

Similaire à DevConf. Дмитрий Сошников - ECMAScript 6

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!Vitebsk Miniq
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)Mikhail Davydov
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 

Similaire à DevConf. Дмитрий Сошников - ECMAScript 6 (20)

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Scala on android
Scala on androidScala on android
Scala on android
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 

DevConf. Дмитрий Сошников - ECMAScript 6

  • 1. ECMAScript > Будущее Дмитрий Сошников http://dmitrysoshnikov.com
  • 3. let : Блочная область видимости
  • 4. let : Блочная область видимости // ES3 if (false) { var logLevel = 10; } alert(logLevel); // ?
  • 5. let : Блочная область видимости // ES3 var logLevel; // = undefined; if (false) { Все переменные создаются до запуска кода – при входе в контекст. logLevel = 10; } Так называемое «поднятие» (hoisting) переменных. alert(logLevel); // undefined See: http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/
  • 6. let : Блочная область видимости // ES6 Harmony if (false) { let logLevel = 10; } alert(logLevel); // ReferenceError
  • 7. let : Блочная область видимости // ES3, ES5 var handlers = []; handlers[0](); // ? for (var k = 0; k < 3; k++) { handlers[1](); // ? handlers[k] = function () { handlers[2](); // ? alert(k); }; }
  • 8. let : Блочная область видимости // ES3, ES5 var handlers = []; var k; handlers[0](); // 3 for (k = 0; k < 3; k++) { handlers[1](); // 3 handlers[k] = function () { handlers[2](); // 3 alert(k); }; }
  • 9. let : Блочная область видимости ES3, ES5 ES6 for (var k = 0; k < 3; k++) { for (let k = 0; k < 3; k++) { (function (x) { let x = k; handlers[x] = function () { handlers[0]();=// 3 handlers[x] function () { alert(x); alert(x); handlers[1](); // 3 }; }; handlers[2](); // 3 })(k); } } handlers[0](); // 0 handlers[0](); // 0
  • 10. let : Блочная область видимости let x = 10; // let-объявление (definition) let y = 20; let (x = x * 2, y = 30) { console.log(x + y); // 50 // let-инструкции (statement) } console.log(x + y); // 30 console.log(let (x = 100) x); // 100 // let-выражения (expression) console.log(x); // 10
  • 12. const : константы const MAX_SIZE = 100; // нельзя перезаписать (let, var, etc.) let MAX_SIZE = 100; // error
  • 13. const : константные функции const registerUser() { // реализация } // ошибка повторного объявления (function, let, var) function registerUser() { ... }
  • 15. Параметры по умолчанию function handleRequest(data, method) { method = method || “GET”; ... }
  • 16. Параметры по умолчанию function handleRequest(data, method) { method = method || “GET”; ... } function handleRequest(data, method = “GET”) { ... }
  • 18. Деструктуризация: массивы // для массивов let [x, y] = [10, 20, 30]; // нестрогий matching console.log(x, y); // 10, 20
  • 19. Деструктуризация: объекты // for objects let user = {name: “Ann”, location: {x: 10, y: 20}}; let {name: userName, location: {x: x, y: y}} = user; console.log(userName, x, y); // “Ann”, 10, 20
  • 20. Деструктуризация параметров функций function Panel(config) { var title = config.title; var x = config.pos[0]; Слишком «шумно» var y = config.pos[1]; return title + x + y; } new Panel({title: “Users”, pos: [10, 15]});
  • 21. Деструктуризация параметров функций function Panel({title: title, pos: [x, y]}) { return title + x + y; } let config = {title: “Users”, pos: [10, 15]}; new Panel(config);
  • 22. Деструктуризация: обмен переменных // обмен двух переменных без третьей? let x = 10; let y = 20; [x, y] = [y, x]; // легко
  • 24. Объект arguments // ES3, ES5 function format(pattern /*, rest */) { var rest = [].slice.call(arguments, 1); var items = rest.filter(function (x) { return x > 1}); return pattern.replace(“%v”, items); } format(“scores: %v”, 1, 5, 3); // scores: 5, 3
  • 25. Прощай, arguments // ES3, ES5 function format(pattern /*, rest */) { var rest = [].slice.call(arguments, 1); // сложно var items = rest.filter(function (x) { return x > 1}); return pattern.replace(“%v”, items); } format(“scores: %v”, 1, 5, 3); // scores: 5, 3
  • 26. Привет, “rest” // ES6 aka Harmony function format(pattern, …rest) { // настоящий массив var items = rest.filter(function (x) { return x > 1}); return pattern.replace(“%v”, items); } format(“scores: %v”, 1, 5, 3); // scores: 5, 3
  • 27. А также “spread” // ES6 aka Harmony function showUser(name, age, weight) { return name + “:” + age + weight; } let user = [“Alex”, 28, 130]; showUser(…user); // ok showUser.apply(null, user); // desugared
  • 28. “rest” массивов при деструктуризации // ES6 aka Harmony let userInfo = [“John”, 14, 21, 3]; let [name, ...scores] = userInfo; console.log(name); // “John” console.log(scores); // [14, 21, 3]
  • 30. Сокращения в деструктуризации let 3DPoint = {x: 20, y: 15, z: 1}; // полная нотация let {x: x, y: y, z: z} = 3DPoint; // сокращенная нотация let {x, y, z} = 3DPoint;
  • 31. Короткий синтаксис функций -> функции // обычная функция [1, 2, 3].map(function (x) { return x * x; }); // [1, 4, 9] // -> функция [1, 2, 3].map((x) -> x * x); // [1, 4, 9] Синтаксически: – опциональный return; – -> вместо function – Блочная скобки не обязательны
  • 32. -> функции: примеры // Пустая функция let empty = ->; // Скобки тела функции необязательны let square= (x) -> x * x; // Функция без параметров let getUser = -> users[current]; // Для сложных выражений скобки нужны let users = [{name: “Mark”, age: 28}, {name: “Sarah”, age: 26}]; users.forEach((user, k) -> { if (k > 2) console.log(user.name, k) });
  • 33. Обычные функции: динамический this function Account(customer, cart) { this.customer = customer; this.cart = cart; $(„#shopping-cart').on('click', function (event) { this.customer.purchase(this.cart); // error on click }); } Решения: var that = this; .bind(this)
  • 34. => функции: лексический this function Account(customer, cart) { this.customer = customer; this.cart = cart; $(„#shopping-cart').on('click', (event) => this.customer.purchase(this.cart); // OK ); }
  • 35. Но… Сейчас также функции-блоки на повестке дня!
  • 36. Короткий синтаксис функций функции-блоки // обычная функция [1, 2, 3].map(function (x) { return x * x; }); // [1, 4, 9] // функция-блок [1, 2, 3].map {|x| x * x}; // [1, 4, 9] Синтаксически: – опциональный return; – |x| вместо function – Необязательные скобки вызова
  • 37. Proxy объекты : мета уровень
  • 38. Proxy-объекты /* handler – обработчик мета-уровня * proto – прототип прокси-объекта */ Proxy.create(handler, [proto]) /* handler – мета-обработчик * call – проксирование вызова * construct – проксирование конструирования */ Proxy.createFunction(handler, [call, [construct]]) See: http://wiki.ecmascript.org/doku.php?id=harmony:proxies
  • 39. Proxy-объекты // original object // proxied object let point = { let loggedPoint = Proxy.create({ x: 10, get: function (rcvr, name) { y: 20 console.log(“get: ”, name); }; return point[name]; }, set: function (rcvr, name, value) { Перехват чтения свойства console.log(“set: ”, name, value); point[name] = value; } Перехват записи }, Object.getPrototypeOf(point)); свойства
  • 40. Proxy-объекты // proxied object Мета-обработчик let loggedPoint = Proxy.create({ get: function (rcvr, name) { // перехват чтения console.log(“get: ”, name); loggedPoint.x; // get: x, 10 return point[name]; }, // перехват записи set: function (rcvr, name, value) { loggedPoint.x = 20; // set: x, 20 console.log(“set: ”, name, value); point[name] = value; // отражается на оригинале } point.x; // 20 }, Object.getPrototypeOf(point));
  • 41. Callable Proxy-объекты // original object // proxied object let point = {x: 10, y: 20}; let loggedPoint = Proxy.createFunction({ get: function (rcvr, name) { console.log(“get: ”, name); function callTrap() { return point[name]; console.log(“call”); }, } set: function (rcvr, name, value) { console.log(“set: ”, name, value); function constructTrap() { point[name] = value; console.log(“construct”); } } }, callTrap, constructTrap); loggedPoint(10, 20); new loggedPoint(100); Перехват Перехват вызова конструирования
  • 42. Proxy : простейший логгер на чтение function logged(object) { return Proxy.create({ get: function (rcvr, name) { console.log(“get:”, name); return object[name]; } }, Object.getPrototypeOf(object)); } let connector = logged({ join: function (node) { ... } }); connector.join(“store@master-node”); // get: join
  • 43. Proxy : примеры // логгеры (на чтение и запись) Proxy.create(logHandler(object)); // множественное наследование (делегирующие примеси) Proxy.create(mixin(obj1, obj2)); // noSuchMethod Proxy.create(object, noSuchMethod) // Массивы с негативными индексами (как в Python, Ruby) let a = Array.new([1, 2, 3]); console.log(a[-1]); // 3 a[-1] = 10; console.log(a); // [1, 2, 10] See: https://github.com/DmitrySoshnikov/es-laboratory/tree/master/examples
  • 45. Модули в ES3, ES5 var DBLayer = (function (global) { /* save original */ var originalDBLayer = global.DBLayer; function noConflict() { 1. Создать локальный скоп global.DBLayer = originalDBLayer; 2. Функция восстановления 3. Имплементация } 4. Публичный интерфейс /* implementation */ function query() { ... } /* exports, public API */ return { noConflict: noConflict, query: query }; })(this);
  • 46. Модули в ES3, ES5 var DBLayer = (function (global) { /* save original */ var originalDBLayer = global.DBLayer; function noConflict() { 1. Создать локальный скоп global.DBLayer = originalDBLayer; 2. Функция восстановления 3. Имплементация } 4. Публичный интерфейс /* implementation */ function query() { ... } /* exports, public API */ Слишком много return { синтаксического «шума». noConflict: noConflict, Нужен «сахар» query: query }; })(this);
  • 47. Модули в ES6 module DBLayer { export function query(s) { ... } export function connection(...args) { ... } } DBLayer.connection(”accounts/recent”); import DBLayer.*; // импортируем все import DBLayer.{query, connection: attachTo}; // только нужные экспорты query(“SELECT * FROM books”).format(“escape | split”); attachTo(“/books/store”, { onSuccess: function (response) { ... } })
  • 48. Внешние модули в ES6 // на файловой системе module $ = require(“./library/selector.js”); // глобально из сети; сами определяем имя модуля module CanvasLib = require(“http:// ... /js-modules/canvas.js”); // используем напрямую let rect = new CanvasLib.Rectangle({width: 30, height: 40, shadow: true}); // или импортируем только нужные объекты import CanvasLib.{Triangle, rotate}; rotate(-30, new Triangle($.query(...params)));
  • 49. Деструктуризация и импорт внешних модулей // запрашиваем модуль и напрямую // импортируем через pattern-matching let {read, format} = require(“fs.js”); // используем импортированные функции read(“storage/accounts.dat”).format(“%line: value”)
  • 50. Генераторы : итераторы и кооперативная многозадачность
  • 51. Генераторы : yield «бесконечные» потоки function fibonacci() { let [prev, curr] = [0, 1]; while (true) { [prev, curr] = [curr, prev + curr]; yield curr; Ручная итерация: Точка следующего входа let seq = fibonacci(); } } seq.next(); // 1 seq.next(); // 2 for (let n in fibonacci()) { seq.next(); // 3 seq.next(); // 5 // truncate the sequence at 1000 seq.next(); // 8 if (n > 1000) break; // 1, 2, 3, 5, 8 ... console.log(n); }
  • 52. Генераторы : yield кастомные итераторы function iterator(object) { Предложенные итераторы ES6: for (let k in object) { // по свойствам (key+value) yield [k, object[k]]; for (let [k, v] in properties(foo)) } } // по значениям for (let v in values(foo)) let foo = {x: 10, y: 20}; // по именам свойств for (let [k, v] in iterator(foo)) { for (let k in keys(foo)) console.log(k, v); // x 10, y 20 } See: http://wiki.ecmascript.org/doku.php?id=strawman:iterators See: https://gist.github.com/865630
  • 53. Генераторы: yield асинхронное программирование Callback’и Сопрограммы xhr("data.json", function (data) { new Task(function () { xhr("user.dat", function (user) { let data = yield xhr("data.json“); xhr("user/save/", function (save) { handlers[0](); // 3 let user = yield xhr(“user.dat“); /* code */ let save = yield xhr(“/user/save“); handlers[1](); // 3 } /* code */ handlers[2](); // 3 } }); }); /* other code */ /* other code */
  • 54. Генераторы : yield кооперативная многозадачность let thread1 = new Thread(function (...args) { for (let k in values([1, 2, 3])) yield k + “ from thread 1”; }).start(); let thread2 = new Thread(function (...args) { for (let k in values([1, 2, 3])) yield k + “ from thread 2”; }).start(); // 1 from thread 1 // 2 from thread 1 // 1 from thread 2 // 3 from thread 1 // 2 from thread 2 // etc.
  • 56. Array comprehensions // map + filter let scores = [1, 7, 4, 9] .filter(function (x) { return x > 5 }) .map(function (x) { return x * x }); // [49, 81]
  • 57. Array comprehensions // map + filter let scores = [1, 7, 4, 9] .filter(function (x) { return x > 5 }) .map(function (x) { return x * x }); // [49, 81] // array comprehensions let scores = [x * x for (x in values([1, 7, 4, 9])) if (x > 5)];
  • 58. Спасибо за внимание Дмитрий Сошников dmitry.soshnikov@gmail.com http://dmitrysoshnikov.com @DmitrySoshnikov