Recap ES5

Recap ES5

ES5

Типы данных в ES5

Функции

Функции объявления
function myFunc () {...} // function declaration

Функции выражения
var myFunc = function () {...}// function expression

Функции

			var myFunc = new Function('a, b', 'console.log(a + b);');
			myFunc('Hello', ' world');
		

Функции

			var myFunc = new Function('a, b', 'console.log(a + b);');
			myFunc('Hello', ' world');
		

Объекты

Литералы объектов

			var citizen = {};
			citizen.name = 'Bob';
			// или так
			var citizen = {
			    name: 'Bob',
			    age: 18
			};
		

Object.create

			var citizen = Object.create({}, {
			    name: {
			        value: 'Bob',
			        enumerable: true
			    }
			});
		

Object.defineProperty

Ключевое слово New

			function Citizen () { // Описание конструктора
			    this.name = 'Bob'
			}
			var citizen = new Citizen();// Создание объекта
			console.log(citizen); // { name: 'Bob' }
		

Прототип

Прототип

Object Человек

  • голова: 1
  • шея: 1
  • туловище: 1
  • рука: 2
  • нога: 2
 

Object Человек

  • голова: 1
  • шея: 1
  • туловище: 1
  • рука: 2
  • нога: 2

Object Bob

  • пол: мужской
  • имя: Bob
  • [[Prototype]]: Object Человек

Bob

Object Человек

  • голова: 1
  • шея: 1
  • туловище: 1
  • рука: 3
  • нога: 2
 

Bob

Bob

	            var bob = {
	                gender: 'man',
	                name: 'Bob',
	                __proto__: human,
	            }
	        

Человек

	            var human = {
	                head: 1,
	                neck: 1,
	                body: 1,
	                arm: 3,
	                leg: 2,
	            }
	        

Prototype Lookup

Prototype Lookup

			console.log(bob.arm); // 3
			human.leg = 4;
			console.log(bob.leg); // 4
			bob.arm = 2;
			bob.leg = 2;
			console.log(bob.arm); // 2
			console.log(bob.leg); // 2
			human.leg = 5;
			console.log(bob.leg); // 2
		
			//Как назначить прототип?
			bob.__proto__ = human;
			human.isPrototypeOf(bob); //true
			console.log(bob.age); //undefined
			human.age = 3.2e9;
			console.log(bob.age); //3200000000
		

__proto__ в ES5 было опасным

Прототип в ES5


Методы чтения/записи

В литерале объекта
			var man = {
			    name: 'Bob',
			    get age() {return this._age + 'y.o.';},
			    set age(value) { this._age = value;}
			    man.age = 70;
			    console.log(man.age);//70 y.o.
			};
		

Strict mode

"use strict"; или 'use strict';
Область объявления:
  1. весь файл, тег <script>
  2. функция

Strict mode

			"use strict"; // Обязательно в самом верху
			var a;
			a = 1;
			b = 1;// ReferenceError!
		

Strict mode

ES6 Basics

Объявления на уровне блоков

блочная область видимости
			{
			    let a = 1;
			    console.log(a); //1
			}
			console.log(a); //ReferenceError
		

Константы

			const a = 1;
			a = 2; //TypeError
			const b = {name: 'Bob'};
			b.name = 'Piter';
			console.log(b.name); // Piter
		

Временная мертвая зона

				{
				    console.log(a); undefined
				    console.log(b); ReferenceError
				    var a;
				    let b;
				}
			

Область видимости объявления функций

			if(condition) {
			    function foo() {...}
			} else {
			    function foo() {...}
			}
		

Параметры по умолчанию

			function getGreetUser(name = 'user', suffix = 'Hello, ') {
			    return suffix + name;
			}
			getGreetUser('Bob'); //Hello, Bob
		

Стрелочные функции

			// функциональные выражения
			var foo = (x, y) => x + y;
			var bar = (x, y) => {
			    return x + y;
			}
			var baz = x => x * 2;
		

Стрелочные функции

Контекст стрелочных функций

			var controller = {
			    do: function(...) {
			        btn.addEventListener('click', function(){
			            console.log(this); //this -> btn
			        });
			    }
			};
		

Контекст стрелочных функций

			var controller = {
			    do: function(...) {
			        btn.addEventListener('click', () => {
			            console.log(this); //this -> Controller
			        });
			    }
			};
		

Spread ... Rest

Когда оператор ... стоит перед массивом (или любым другим набором доступных для перебора значений) он разделяет массив на отдельные значения
			function foo(a, b, c) {
			    return a + b + c;
			}
			foo(...[1, 2, 3]); // 6
		

Spread ... Rest

Когда оператор ... принимает множественные значения, например, в определении функции, то он собирает аргументы в один массив
				function foo(...a) {
				    return a;
				}
				foo(1, 2, 3); // Array [1, 2, 3]
			

Деструктурирующее присваивание

			var [a, b, c] = [10, 2, 33];
			console.log(a, b, c); //10, 2, 33
			// А если с объектами
			var {name, age} = {name: 'Bob', age: 22};
			var {что: куда} = {name: 'Bob', age: 22};
			var {name:a, age} = {name: 'Bob', age: 22}
			console.log(a); // Bob
		

Деструктурирующее присваивание

            // Значение по умолчанию
            var {name, gender} = {name: 'Bob', age: 22};
            console.log(gender); //undefined
            var {name, gender='male'} = {name: 'Bob', age: 22};
            console.log(gender); //male
        

Глубже

			var {parent: {dad: {name: name, age: age}}} = {
			    parent: {
			        dad: {
			            name: 'Bill', age: 70
			        }
			    }
			}
			console.log(name, age) // Bill 70
		

Расширения объектных литералов

Краткие свойства

			var name = 'Bob';
			var foo = {
			    name: name
			};
		

Краткие свойства

			var name = 'Bob';
			var foo = {
			    name
			};
		

Краткие методы

			var foo = {
			    baz: function() {
			        //...
			    }
			};
			foo.baz();
		

Краткие методы

				var foo = {
				    baz() {
				        //...
				    }
				};
				foo.baz();
			

Ключевое слово super

			var bar = { a: 1};
			var foo = { 
			    baz() {
			        console.log(super.a);
			    },
			    __proto__: bar
			};
			foo.baz(); // 1
		

Ключевое слово super

            var bar = { a: 1};
            var foo = { 
                a: 2,
                baz() {
                    console.log(super.a); // 1
                },
                __proto__: bar
            };
        

Вычисляемые свойства

В ES5 была возможность получить доступ к вычисляемому имени свойства объекта
            var person = {};
            var field = 'name';
            person[field] = 'Bob'; // Bob
        

Вычисляемые свойства

В ES6 можно делать это внутри литерала
            var field = 'name';
            var person = {
                 [field]: 'Bob'
            } //{ name: 'Bob' }
        

Шаблонные строки

Интерполированные строковые литералы

Шаблонные строки

            var str = `Это длинная строка
                которую можно перенести на другую
                строку`;
            var name = 'Bob';
            var greet = `Hello, ${name}`; // Hello, Bob
        

Интерполированные выражения

            function upper(str) {
                return str.toUpperCase();
            }
            var name = "Bob";
            var greet = `Hello, ${upper( `${name}` )}`; // Hello, BOB
        

Тегированные шаблонные строки

            function tag(str, ...param) {
                // ...
            }
            tag `Hello, ${name}`;
        

Тегированные шаблонные строки

            var name = 'Bob';
            var mr = 'mr.';
            function tag(str, ...param) {
                return str.reduce((prev, current, index) => {
                    return prev + param[index - 1] + current;
                });
            }
            var res = tag `Hello, ${mr} ${name}`;
        

Спасибо!

Домашнее задание

ES6-homework

Самостоятельное изучение

Спасибо!

Denis Zavgorodny
web technologist, founder of @ChernivtsiJS,
mentor at @NodeSchool Chernivtsi

@DenisZavgorodny

denis.zavgorodny@gmail.com