ES5
		
			- вышел в 2009
 
			- поддержка 97,55%
 
			- Strict mode
 
			- native JSON
 
			- Array methods
 
		
	
	
		Типы данных в ES5
		
			- string
 
			- number
 
			- boolean
 
			- null
 
			- undefined
 
			- object
 
		
	
	
		Функции
		Функции объявления
		function myFunc () {...} 
		
		Функции выражения
		var myFunc =  function () {...}
	
	
		Функции
		
			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');
		
	
	
		Объекты
		
			- Литералы объектов
 
			Object.create() 
			- ключевое слово new
 
		
	
	
		Литералы объектов
		
			var citizen = {};
			citizen.name = 'Bob';
			
			var citizen = {
			    name: 'Bob',
			    age: 18
			};
		
	
	
		Object.create
		
			var citizen = Object.create({}, {
			    name: {
			        value: 'Bob',
			        enumerable: true
			    }
			});
		
    
    
        Object.defineProperty
        
            writable: false, 
            configurable: false, 
            enumerable: false 
        
    
	
		Ключевое слово New
		
			function Citizen () { 
			    this.name = 'Bob'
			}
			var citizen = new Citizen();
			console.log(citizen); 
		
	
	
	
		Прототип
		
			- Объекты наследуются от объектов
 
			- Связь хранится в 
[[prototype]] 
			prototype не [[prototype]] 
			- Объекты можно объединять в цепочки через прототипы
 
		
	
	
		
			
				
					
						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
		
	
	
		
			console.log(bob.arm); 
			human.leg = 4;
			console.log(bob.leg); 
			bob.arm = 2;
			bob.leg = 2;
			console.log(bob.arm); 
			console.log(bob.leg); 
			human.leg = 5;
			console.log(bob.leg); 
		
	
	
		
			
			bob.__proto__ = human;
			human.isPrototypeOf(bob); 
			console.log(bob.age); 
			human.age = 3.2e9;
			console.log(bob.age); 
		
		
        __proto__ в ES5 было опасным
		
	
	
		Прототип в ES5
		
		
			- Используем 
Object.create(proto[, propertiesObject]) 
			
			- Расширяем 
.prototype конструктора 
		
	
	
		Методы чтения/записи
		В литерале объекта
		
			var man = {
			    name: 'Bob',
			    get age() {return this._age + 'y.o.';},
			    set age(value) { this._age = value;}
			    man.age = 70;
			    console.log(man.age);
			};
		
	
	
		Strict mode
		"use strict"; или 'use strict';
		Область объявления:
		
			- весь файл, тег 
<script> 
			- функция
 
		
	
	
		Strict mode
		
			"use strict"; 
			var a;
			a = 1;
			b = 1;
		
	
	
		Strict mode
		
			- не допускается 
with 
			- необходимо объявлять переменные
 
			- при простом вызове функции в 
this undefined 
			- ...
 
		
	
	
	
		Объявления на уровне блоков
		блочная область видимости
		
			{
			    let a = 1;
			    console.log(a); 
			}
			console.log(a); 
		
	
	
		Константы
		
			const a = 1;
			a = 2; 
			const b = {name: 'Bob'};
			b.name = 'Piter';
			console.log(b.name); 
		
	
	
		Временная мертвая зона
		
				{
				    console.log(a); 
				    console.log(b); 
				    var a;
				    let b;
				}
			
	
	
		Область видимости объявления функций
		
			- область видимости стала блочной в 
strict mode 
			- объявления функций все еще поднимаются в верх области видимости
 
		
		
			if(condition) {
			    function foo() {...}
			} else {
			    function foo() {...}
			}
		
	
	
		Параметры по умолчанию
		
			function getGreetUser(name = 'user', suffix = 'Hello, ') {
			    return suffix + name;
			}
			getGreetUser('Bob'); 
		
	
	
		Стрелочные функции
		
			
			var foo = (x, y) => x + y;
			var bar = (x, y) => {
			    return x + y;
			}
			var baz = x => x * 2;
		
	
	
		Стрелочные функции
		
			- новый синтаксис
 
			- всегда функциональные выражения
 
			- лексический контекст this
 
		
	
	
		Контекст стрелочных функций
		
			var controller = {
			    do: function(...) {
			        btn.addEventListener('click', function(){
			            console.log(this); 
			        });
			    }
			};
		
	
	
		Контекст стрелочных функций
		
			var controller = {
			    do: function(...) {
			        btn.addEventListener('click', () => {
			            console.log(this); 
			        });
			    }
			};
		
	
	
		Spread ... Rest
		Когда оператор ... стоит перед массивом (или любым другим набором
			доступных для перебора значений) он разделяет массив на отдельные значения
		
			function foo(a, b, c) {
			    return a + b + c;
			}
			foo(...[1, 2, 3]); 
		
	
	
		Spread
			... Rest
		Когда оператор
			... принимает множественные значения, например, в определении функции,
			то он собирает аргументы в один массив
		
				function foo(...a) {
				    return a;
				}
				foo(1, 2, 3); 
			
	
	
		Деструктурирующее присваивание
		
			var [a, b, c] = [10, 2, 33];
			console.log(a, b, c); 
			// А если с объектами
			var {name, age} = {name: 'Bob', age: 22};
			var {что: куда} = {name: 'Bob', age: 22};
			var {name:a, age} = {name: 'Bob', age: 22}
			console.log(a); 
		
    
    
        Деструктурирующее присваивание
        
            
            var {name, gender} = {name: 'Bob', age: 22};
            console.log(gender); 
            var {name, gender='male'} = {name: 'Bob', age: 22};
            console.log(gender); 
        
    
	
		Глубже
		
			var {parent: {dad: {name: name, age: age}}} = {
			    parent: {
			        dad: {
			            name: 'Bill', age: 70
			        }
			    }
			}
			console.log(name, age) 
		
	
	
		Расширения объектных литералов
		
			- краткие свойства
 
			- краткие методы
 
			- вычисляемые свойства
 
		
	
	
		Краткие свойства
		
			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(); 
		
    
    
        Ключевое слово
            super
        
        
            var bar = { a: 1};
            var foo = { 
                a: 2,
                baz() {
                    console.log(super.a); 
                },
                __proto__: bar
            };
        
    
    
        Вычисляемые свойства
        В ES5 была возможность получить доступ к вычисляемому имени свойства объекта
        
            var person = {};
            var field = 'name';
            person[field] = 'Bob'; 
        
    
    
        Вычисляемые свойства
        В ES6 можно делать это внутри литерала
        
            var field = 'name';
            var person = {
                 [field]: 'Bob'
            } 
        
    
    
        Шаблонные строки
        Интерполированные строковые литералы
        
            - могут содержать внутри себя переменные и выражения
 
            - допускают переносы строк
 
            - переменные и выражения внутри литерала анализируются и вычисляются
 
            - напоминает самовызывающуюся функцию
(Immediately Invoked Function Expression) 
        
    
    
        Шаблонные строки
        
            var str = `Это длинная строка
                которую можно перенести на другую
                строку`;
            var name = 'Bob';
            var greet = `Hello, ${name}`; 
        
    
    
        Интерполированные выражения
        
            function upper(str) {
                return str.toUpperCase();
            }
            var name = "Bob";
            var greet = `Hello, ${upper( `${name}` )}`; 
        
    
    
        Тегированные шаблонные строки
        
            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}`;