SlideShare a Scribd company logo
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов
Разработчик JavaScript
JavaScript
Базовые знания
Базовый синтаксис
Expression (Выражение, Оператор),
Statement (Блочное выражение, Блок)
4
Statement
•  Блочное выражение
–  if (){}, try{}catch(e){}, function a(){}
•  Директива интерпретатору
–  return, throw, break, continue, var, …
•  Может включать другие блочные выражения
•  Может включать выражения
•  Не возвращает значение
•  Не может быть аргументом Expression
•  Можно сделать из Expression – Expression;
http://es5.github.com/#x12
5
Expression
•  Оператор
–  С одним аргументом typeof, !, (), ++, --, new, +,…
–  С двумя ==, ===, >, <, instanceof, +, -,…
–  С тремя a?b:c,…
–  Вызов функции
–  Оператор запятая
•  Может включать другие операторы
•  Не может включать Statement
•  Возвращает значение
•  Может быть в составе Statement
http://es5.github.com/#x11
Приведение типов
7
Приведение типов
•  Зависит от оператора
–  Оператор имеет определенный алгоритм
•  Зависит от типа аргументов
•  Внутренние функции JavaScript
–  ToNumber, ToString, ToBoolean, ToObject
8
Сильно перегружен: сложение чисел, конкатенация строк
"2" + 3; // "23"
2 + 3; // 5
Пример: оператор + и примитивы
// Что происходит в внутренностях JavaScript
a = ToPrimitive(a);
b = ToPrimitive(b);
if (Type(a) === "String" ||
Type(b) === "String") {
return Concat(ToString(a), ToString(b));
} else {
return ToNumber(2) + ToNumber(3);
}
http://es5.github.com/#x11.6.1
9
Что если один из операндов
– Object?
10
Применяется тот же алгоритм
Вся «магия» в ToString({})
"2" + {}; // "2[object Object]"
Пример: оператор + объект
Concat(ToString("2"), ToString({}));
ToString({}) ->
ToPrimitive({}, "String")
ToPrimitive({}, "String") ->
({}).[[DefaultValue]]("String")
http://es5.github.com/#x8.12.8
11
Применяется тот же алгоритм
Вся «магия» в ToString({})
Пример: оператор + объект
if (IsCallable({}.toString)) {
return ({}).toString();
} else if (IsCallable({}.valueOf)) {
return ({}). valueOf();
} else {
throw new TypeError();
}
http://es5.github.com/#x8.12.8
12
[]+{}
13
The Abstract Equality Comparison Algorithm
Операторы == и ===
'' == '0' // false
0 == '' // true
0 == '0' // true
false == undefined // false
false == null // false
null == undefined // true
http://es5.github.com/#x11.9.3
14
'' === '0' // false
0 === '' // false
0 === '0' // false
false === undefined // false
false === null // false
null === undefined // false
+0 === -0 // true
Операторы == и ===
The Strict Equality Comparison Algorithm
http://es5.github.com/#x11.9.6
15
Оператор typeof
Type(val) Результат
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Object "object"
Object и имеет [[Call]] "function”
http://es5.github.com/#x11.4.3
Алгоритм
- Ссылка не достижима (IsUnresolvableReference) – возвращаем "undefined"
- Иначе смотрим по таблице
16
WAT?
• [1] > 0; // ?
• [1,1] > 0; // ?
• [1,] > 0; // ?
• [1,,] > 0; // ?
• [1] > "0"; // ?
17
WAT?
• [1] > 0; // true
• [1,1] > 0; // false
• [1,] > 0; // true
• [1,,] > 0; // false
• [1] > "0"; // ?
Функции
Function Declaration,
Conditional Function Declaration,
Function Expression,
Named Function Expression,
IEFE
19
На самом деле Function в
JavaScript – это Object со
скрытым полем [[Call]]
http://es5.github.com/#x13.2
20
- Это Statement
- Инициализируется во время входа в контекст
- Объявляется в блоке функции или в глобальном блоке
a(); // OK
function a() {
b(); // OK
function b() {
}
}
a();
Function Declaration/Definition
http://es5.github.com/#x13
21
- Это тоже Statement
- Инициализируется во время входа в контекст или в рантайме
- По стандарту такая запись недопустима
if (true) {
function a() {
return 1;
}
} else {
function a() {
return 2;
}
}
a(); // Firefox – 1, Others - 2
Conditional Function Declaration
22
- При использовании строгого режима тут будет SyntaxError
"use strict";
if (true) {
function a() {
return 1;
}
} else {
function a() {
return 2;
}
}
// SyntaxError
// Use Function Expression!
CFD+Strict Mode
23
- Это expression
- Инициализируется в рантайме
- Объявляется где угодно
a(); // error
var a = function () {
b(); // error
var b = function () {};
b(); // ok
};
a(); // ok
Function Expression
http://es5.github.com/#x11.2.5
24
- Это тот же Function Expression
- Можно обратиться к себе по своему имени
- Имя доступно только в своем блоке (кроме старых IE)
(function timer() {
setTimeout(timer, 1000);
console.log(+new Date);
}());
typeof timer; // undefined, Old IE -
function
Named Function Expression
25
- Это тот же Function Expression
-  Мы даем понять интерпретатору, что этот код - Function Expression
-  IEFE позволяет эмулировать блочную область видимости
function (){}(); // SyntaxError
!function (){}(); // OK
+function (){}(); // OK
*function (){}(); // OK
(function (){}()); // OK
[function (){}()]; // OK
var a = function (){}();
var a = (function (){}()); // The best
IEFE
Область видимости
Определяется во время создания функции
Не меняется при передаче функции
Образует цепочку областей видимости
Лексическая
Образует «замыкание»
27
var a = 1;
function foo() {
var c = 2;
function bar(e) {
return a + c + e;
}
return bar(3);
}
foo(); // 6
Область видимости
http://es5.github.com/#x10.3
http://es5.github.com/#x10.2
28
Цепочка областей видимости
GLOBAL
a 1
foo func(on
foo
c 2
bar func(on
bar
e argument
Вызов функции и this
this – основная грабля в JavaScript
Прямой вызов
Вызов через c оператором точка и []
Вызов через new
Вызов через call, apply, bind
30
This в JavaScript
определяется во время
вызова функции!
http://es5.github.com/#x11.2.3
31
() – это оператор вызова функции
this всегда undefined но он трансформируется в global
В строгом режиме всегда undefined (трансформации нет)
function a() {
console.log(this);
}
a(); // window (undefined -> window)
function b() {
"use strict";
console.log(this);
}
b(); // undefined
Прямой вызов – через оператор ()
32
Это Expression
this – объект от которого был получена эта функция
var foo = {
bar: function () {
console.log(this);
}
};
foo.bar(); // foo
var baz = {};
baz.bar = foo.bar;
baz.bar(); // baz
var fooBar = foo.bar;
fooBar(); // ???
Вызов функции и оператор . и []
http://es5.github.com/#x11.2.1
33
Это Expression
new – это еще один способ вызова функции
Каждая функция может быть конструктором
this – пустой объект со ссылкой на prototype вызываемой функции
var A = function () {
console.log(this);
console.log(
this.__proto__ === A.prototype
);
};
new A(); // Object, true
Оператор new
http://es5.github.com/#x11.2.2
34
Это способ управлять значением this
this – объект, который вы передаете
var a = function (a, b) {
console.log(this, a, b);
};
a.call([]); // [], undefined, …
a.call([], 1, 2); // [], 1, 2
a.apply([], [1, 2]); // [], 1, 2
Call, apply
http://es5.github.com/#x15.3.4.4	

http://es5.github.com/#x15.3.4.3
35
Это способ подменять this без вызова функции
this – объект, который вы передаете
var a = function () {
console.log(this);
};
var b = a.bind({});
b(); // {}
Bind
http://es5.github.com/#x15.3.4.5
MDN Function#bind http://clck.ru/2EeTx
Вызов функции, arguments
Передача значения
arguments
37
Передача значения в функцию
•  Значения передаются по ссылке
•  Можно менять «поля» переданного объекта
•  Примитив менять нельзя
•  Можно переписать ссылку без потери
объекта
38
arguments
•  Как и this появляется при вызове
•  Это не Array
•  Содержит список всех аргументов
–  arguments[0]…
•  Содержит ссылку на вызывающий конекст
–  arguments.caller
–  Deprecated!
•  Содержит ссылку на себя
–  arguments.calle
http://es5.github.com/#x10.6
Прототипное наследование
prototype и __proto__,
Цепочка прототипов,
Оператор получения свойства,
Оператор instanceof,
Оператор new
40
Сказка о мутантах
41
Сказка о мутантах
•  В далекой-далекой галактике
•  Нет привычного нам наследования
•  Есть телепатическое наследование
–  "Телегенез"
•  Действующие лица:
–  Дедушка
–  Отец
–  Сын
42
Структура мутанта
Мутант	

"Телепатические"	

гены	

Собственные	

гены	

Движение генов
43
Все зеленые
Color	
  
Дед	

 Отец	

 Сын
44
Дед: хочу стать синим!
Color	
  
Дед	

 Отец	

 Сын
45
Все посинели
Color	
  
Дед	

 Отец	

 Сын
46
Отец: верну-ка я цвет
Color	
   Color	
  
Дед	

 Отец	

 Сын
47
Дед синий, отец и сын зеленые
Color	
   Color	
  
Дед	

 Отец	

 Сын
48
Сын: хочу быть черным
Color	
  
Color	
   Color	
  
Дед	

 Отец	

 Сын
49
Мутанты и JavaScript
Size,	
  
Age	
  
Color	
  
Объект	

Свойства 	

прототипа	

Собственные	

свойства	

Делегирование	

Цепочка прототипов
50
Собственные свойства и прототип
•  Собственные свойства
•  Свойства прототипа
•  Любой объект имеет ссылку на прототип
–  И примитив также*
–  Имеет с рождения
–  По умолчанию – Object.prototype
•  Делегирование
–  Мы можем пользоваться функциями прототипа не имея собственных
•  Цепочка прототипов
–  Каждый прототип это тот же объект
–  Который также может иметь прототип
–  У прототипа прототипа также может быть прототип
51
prototype и __proto__
•  prototype – свойство функции
–  Оно есть у функции с рождения
–  По умолчанию это пустой объект
•  __proto__ – ссылка на prototype у объекта
–  Во многих движках JavaScript оно скрыто
–  Определяется во время работы оператора new
http://es5.github.com/#x15.3.5.2
http://es5.github.com/#x8.6.2
52
Цепочка прототипов
это способ наследования в JavaScript
53
Работа оператора new
•  new(Constructor, arguments):*!
•  Получает на вход 2 операнда
–  Функция должна иметь свойство prototype
•  Создает временный объект (obj)
•  Добавляет свойство __proto__
–  obj.__proto__ = Constructor.prototype
•  Вызывает конструктор над объектом
–  Constructor.apply(obj, arguments)
•  Конструктор вернул примитив. Результат obj
•  Иначе то, что вернул конструктор
54
function myNew(Constructor, args) {
if (typeof Constructor !== "function") {
throw new TypeError();
}
if (typeof Constructor.prototype === "undefined") {
throw new TypeError();
}
var obj = {
__proto__: Constructor.prototype
};
var result = Constructor.apply(obj, args);
if (typeof result === "object" && result !== null ||
typeof result === "function") {
return result;
}
return obj;
}
Оператор new в коде
55
Цепочка прототипов
// Конструктор Grandfather
var Grandfather = function () {};
Grandfather.prototype.color = 'green';
// Конструктор Father
var Father = function () {};
typeof Father.prototype === 'object';
// Для цепочки нам нужно получить вот это
Father.prototype = {
__proto__: Grandfather.prototype
};
56
Строим цепочку прототипов явно
// Конструктор Father
var Father = function () {};
Father.prototype = new Grandfather();
// Как помним, это аналогично:
Father.prototype = {
__proto__: Grandfather.prototype
};
57
Оператор new используется
для построения цепочек
прототипов
58
Оператор . и []
•  Выполняет поиск свойства
•  Использует цепочку прототипов
•  Ищет в собственных свойствах
•  Затем рекурсивно по ссылке __proto__
•  Если __proto__ null – возвратит undefined
http://es5.github.com/#x11.2.1
59
var Foo = function () {
// Собственное свойство
this.b = 146;
};
Foo.prototype.bar = function () {
console.log(this);
};
Foo.prototype.a = 123;
Оператор . и []
60
var foo = new Foo();
foo.__ptoto__ === Foo.prototype;
Оператор . и []
61
Оператор . и []
foo
b 146
__proto__ object
Foo.prototype
bar function
a 123
__proto__ object
Object.prototype
__proto__ null
http://es5.github.com/#x4.2.1
62
var foo = new Foo();
foo.__ptoto__ === Foo.prototype;
foo.bar(); // foo
foo.a; // 123
foo['b']; // 146
foo.c; // undefined
Foo.prototype.c = 8;
foo.c; // 8 <- Magic???
Оператор . и []
63
Оператор instanceof
•  Использует цепочку прототипов
•  Рекурсивно ищет __proto__ === prototype
64
var Foo = function () {
this.b = 146;
};
var foo = new Foo();
foo instanceof Foo; // true
foo instanceof Object; // true
foo instanceof Array; // false
Оператор instanceof
http://es5.github.com/#x11.8.6
65
Цепочка прототипов
foo
b 146
__proto__ object
Foo.prototype
bar function
a 123
__proto__ object
Object.prototype
__proto__ null
66
var Foo = function () {
this.b = 146;
};
var foo = new Foo();
Foo.prototype.__proto__ = Array.prototype;
foo instanceof Array; // true (!)
Оператор instanceof
http://es5.github.com/#x11.8.6
67
Цепочка прототипов
foo
b 146
__proto__ object
Foo.prototype
bar function
a 123
__proto__ object
Array.prototype
__proto__ object
Object.prototy
Strict Mode
На самоподготовку
- выделите отличия от обычного режима
- всегда ли стоит применять Strict Mode?
- в каком месте кода стоит объявлять SM?
http://es5.github.com/#x10.1.1
Annotated ECMAScript 5.1
http://es5.github.com/
Mozilla Developer Network
https://developer.mozilla.org/en-US/
Основы и заблуждения насчет JavaScript
http://habrahabr.ru/post/120193/
Михаил Давыдов
Разработчик JavaScript
azproduction@yandex-team.ru
azproduction
Спасибо

More Related Content

PDF
Михаил Давыдов — JavaScript: Базовые знания
PDF
Михаил Давыдов - JavaScript. Базовые знания
PPTX
Поговорим о JavaScript, основы и современные тенденции развития языка
PDF
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
PDF
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
PDF
JavaScript. Basics (in russian)
PPTX
функции в Java script
PPT
Характерные черты функциональных языков программирования
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Поговорим о JavaScript, основы и современные тенденции развития языка
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
JavaScript. Basics (in russian)
функции в Java script
Характерные черты функциональных языков программирования

What's hot (20)

PDF
JPoint 2015 - Javassist на службе Java-разработчика
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
PDF
хитрости выведения типов
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PPTX
Javascript 1
PDF
Объектно-ориентированное программирование. Лекция 7 и 8.
PPTX
Как написать JIT компилятор
PDF
C++ осень 2012 лекция 9
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PDF
Лекция 9. Модули, пакеты и система импорта.
PPTX
алгоритмы stl
PDF
Лекция 7. Исключения и менеджеры контекста.
PPTX
десант презентация
PPTX
Александр Фокин, Рефлексия в C++
PDF
C++ Базовый. Занятие 01.
PDF
Лекция 13. Многопоточность и GIL
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
PDF
Лекция 11. Тестирование.
PDF
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
JPoint 2015 - Javassist на службе Java-разработчика
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
хитрости выведения типов
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Javascript 1
Объектно-ориентированное программирование. Лекция 7 и 8.
Как написать JIT компилятор
C++ осень 2012 лекция 9
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Лекция 9. Модули, пакеты и система импорта.
алгоритмы stl
Лекция 7. Исключения и менеджеры контекста.
десант презентация
Александр Фокин, Рефлексия в C++
C++ Базовый. Занятие 01.
Лекция 13. Многопоточность и GIL
Объектно-ориентированное программирование. Лекции 9 и 10
Борис Сазонов, RAII потоки и CancellationToken в C++
Лекция 11. Тестирование.
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Ad

Similar to Михаил Давыдов: JavaScript. Базовые знания (20)

PDF
Михаил Давыдов - Транспорт, ajax
PDF
JavaScript. Loops and functions (in russian)
PPTX
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
PDF
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
PPTX
OOP in JavaScript - Presentation by Eugene Kalosha
PDF
Обзор ES2015(ES6)
PPTX
Ecma script 6 yevhen diachenko
PDF
JavaScript Базовый. Занятие 03.
PPTX
course js day 2
PDF
new JavaScript
PDF
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
PDF
Ecma script 6 in action
PDF
JavaScript Базовый. Занятие 02.
PPT
Подробная презентация JavaScript 6 в 1
PPT
Подробная презентация JavaScript 6 в 1
PPTX
course js day 1
PDF
JavaScript. OOP (in russian)
PPTX
введение в Javascript
PPTX
Pavel Rumantsev - Java Script
Михаил Давыдов - Транспорт, ajax
JavaScript. Loops and functions (in russian)
Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
OOP in JavaScript - Presentation by Eugene Kalosha
Обзор ES2015(ES6)
Ecma script 6 yevhen diachenko
JavaScript Базовый. Занятие 03.
course js day 2
new JavaScript
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Ecma script 6 in action
JavaScript Базовый. Занятие 02.
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
course js day 1
JavaScript. OOP (in russian)
введение в Javascript
Pavel Rumantsev - Java Script
Ad

More from Yandex (20)

PDF
Предсказание оттока игроков из World of Tanks
PDF
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
PDF
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
PDF
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
PDF
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PDF
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
PDF
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
PDF
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
PDF
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
PDF
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
PDF
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
PDF
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
PDF
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
PDF
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
PDF
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
PDF
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
PDF
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Предсказание оттока игроков из World of Tanks
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...

Михаил Давыдов: JavaScript. Базовые знания

  • 3. Базовый синтаксис Expression (Выражение, Оператор), Statement (Блочное выражение, Блок)
  • 4. 4 Statement •  Блочное выражение –  if (){}, try{}catch(e){}, function a(){} •  Директива интерпретатору –  return, throw, break, continue, var, … •  Может включать другие блочные выражения •  Может включать выражения •  Не возвращает значение •  Не может быть аргументом Expression •  Можно сделать из Expression – Expression; http://es5.github.com/#x12
  • 5. 5 Expression •  Оператор –  С одним аргументом typeof, !, (), ++, --, new, +,… –  С двумя ==, ===, >, <, instanceof, +, -,… –  С тремя a?b:c,… –  Вызов функции –  Оператор запятая •  Может включать другие операторы •  Не может включать Statement •  Возвращает значение •  Может быть в составе Statement http://es5.github.com/#x11
  • 7. 7 Приведение типов •  Зависит от оператора –  Оператор имеет определенный алгоритм •  Зависит от типа аргументов •  Внутренние функции JavaScript –  ToNumber, ToString, ToBoolean, ToObject
  • 8. 8 Сильно перегружен: сложение чисел, конкатенация строк "2" + 3; // "23" 2 + 3; // 5 Пример: оператор + и примитивы // Что происходит в внутренностях JavaScript a = ToPrimitive(a); b = ToPrimitive(b); if (Type(a) === "String" || Type(b) === "String") { return Concat(ToString(a), ToString(b)); } else { return ToNumber(2) + ToNumber(3); } http://es5.github.com/#x11.6.1
  • 9. 9 Что если один из операндов – Object?
  • 10. 10 Применяется тот же алгоритм Вся «магия» в ToString({}) "2" + {}; // "2[object Object]" Пример: оператор + объект Concat(ToString("2"), ToString({})); ToString({}) -> ToPrimitive({}, "String") ToPrimitive({}, "String") -> ({}).[[DefaultValue]]("String") http://es5.github.com/#x8.12.8
  • 11. 11 Применяется тот же алгоритм Вся «магия» в ToString({}) Пример: оператор + объект if (IsCallable({}.toString)) { return ({}).toString(); } else if (IsCallable({}.valueOf)) { return ({}). valueOf(); } else { throw new TypeError(); } http://es5.github.com/#x8.12.8
  • 13. 13 The Abstract Equality Comparison Algorithm Операторы == и === '' == '0' // false 0 == '' // true 0 == '0' // true false == undefined // false false == null // false null == undefined // true http://es5.github.com/#x11.9.3
  • 14. 14 '' === '0' // false 0 === '' // false 0 === '0' // false false === undefined // false false === null // false null === undefined // false +0 === -0 // true Операторы == и === The Strict Equality Comparison Algorithm http://es5.github.com/#x11.9.6
  • 15. 15 Оператор typeof Type(val) Результат Undefined "undefined" Null "object" Boolean "boolean" Number "number" String "string" Object "object" Object и имеет [[Call]] "function” http://es5.github.com/#x11.4.3 Алгоритм - Ссылка не достижима (IsUnresolvableReference) – возвращаем "undefined" - Иначе смотрим по таблице
  • 16. 16 WAT? • [1] > 0; // ? • [1,1] > 0; // ? • [1,] > 0; // ? • [1,,] > 0; // ? • [1] > "0"; // ?
  • 17. 17 WAT? • [1] > 0; // true • [1,1] > 0; // false • [1,] > 0; // true • [1,,] > 0; // false • [1] > "0"; // ?
  • 18. Функции Function Declaration, Conditional Function Declaration, Function Expression, Named Function Expression, IEFE
  • 19. 19 На самом деле Function в JavaScript – это Object со скрытым полем [[Call]] http://es5.github.com/#x13.2
  • 20. 20 - Это Statement - Инициализируется во время входа в контекст - Объявляется в блоке функции или в глобальном блоке a(); // OK function a() { b(); // OK function b() { } } a(); Function Declaration/Definition http://es5.github.com/#x13
  • 21. 21 - Это тоже Statement - Инициализируется во время входа в контекст или в рантайме - По стандарту такая запись недопустима if (true) { function a() { return 1; } } else { function a() { return 2; } } a(); // Firefox – 1, Others - 2 Conditional Function Declaration
  • 22. 22 - При использовании строгого режима тут будет SyntaxError "use strict"; if (true) { function a() { return 1; } } else { function a() { return 2; } } // SyntaxError // Use Function Expression! CFD+Strict Mode
  • 23. 23 - Это expression - Инициализируется в рантайме - Объявляется где угодно a(); // error var a = function () { b(); // error var b = function () {}; b(); // ok }; a(); // ok Function Expression http://es5.github.com/#x11.2.5
  • 24. 24 - Это тот же Function Expression - Можно обратиться к себе по своему имени - Имя доступно только в своем блоке (кроме старых IE) (function timer() { setTimeout(timer, 1000); console.log(+new Date); }()); typeof timer; // undefined, Old IE - function Named Function Expression
  • 25. 25 - Это тот же Function Expression -  Мы даем понять интерпретатору, что этот код - Function Expression -  IEFE позволяет эмулировать блочную область видимости function (){}(); // SyntaxError !function (){}(); // OK +function (){}(); // OK *function (){}(); // OK (function (){}()); // OK [function (){}()]; // OK var a = function (){}(); var a = (function (){}()); // The best IEFE
  • 26. Область видимости Определяется во время создания функции Не меняется при передаче функции Образует цепочку областей видимости Лексическая Образует «замыкание»
  • 27. 27 var a = 1; function foo() { var c = 2; function bar(e) { return a + c + e; } return bar(3); } foo(); // 6 Область видимости http://es5.github.com/#x10.3 http://es5.github.com/#x10.2
  • 28. 28 Цепочка областей видимости GLOBAL a 1 foo func(on foo c 2 bar func(on bar e argument
  • 29. Вызов функции и this this – основная грабля в JavaScript Прямой вызов Вызов через c оператором точка и [] Вызов через new Вызов через call, apply, bind
  • 30. 30 This в JavaScript определяется во время вызова функции! http://es5.github.com/#x11.2.3
  • 31. 31 () – это оператор вызова функции this всегда undefined но он трансформируется в global В строгом режиме всегда undefined (трансформации нет) function a() { console.log(this); } a(); // window (undefined -> window) function b() { "use strict"; console.log(this); } b(); // undefined Прямой вызов – через оператор ()
  • 32. 32 Это Expression this – объект от которого был получена эта функция var foo = { bar: function () { console.log(this); } }; foo.bar(); // foo var baz = {}; baz.bar = foo.bar; baz.bar(); // baz var fooBar = foo.bar; fooBar(); // ??? Вызов функции и оператор . и [] http://es5.github.com/#x11.2.1
  • 33. 33 Это Expression new – это еще один способ вызова функции Каждая функция может быть конструктором this – пустой объект со ссылкой на prototype вызываемой функции var A = function () { console.log(this); console.log( this.__proto__ === A.prototype ); }; new A(); // Object, true Оператор new http://es5.github.com/#x11.2.2
  • 34. 34 Это способ управлять значением this this – объект, который вы передаете var a = function (a, b) { console.log(this, a, b); }; a.call([]); // [], undefined, … a.call([], 1, 2); // [], 1, 2 a.apply([], [1, 2]); // [], 1, 2 Call, apply http://es5.github.com/#x15.3.4.4 http://es5.github.com/#x15.3.4.3
  • 35. 35 Это способ подменять this без вызова функции this – объект, который вы передаете var a = function () { console.log(this); }; var b = a.bind({}); b(); // {} Bind http://es5.github.com/#x15.3.4.5 MDN Function#bind http://clck.ru/2EeTx
  • 37. 37 Передача значения в функцию •  Значения передаются по ссылке •  Можно менять «поля» переданного объекта •  Примитив менять нельзя •  Можно переписать ссылку без потери объекта
  • 38. 38 arguments •  Как и this появляется при вызове •  Это не Array •  Содержит список всех аргументов –  arguments[0]… •  Содержит ссылку на вызывающий конекст –  arguments.caller –  Deprecated! •  Содержит ссылку на себя –  arguments.calle http://es5.github.com/#x10.6
  • 39. Прототипное наследование prototype и __proto__, Цепочка прототипов, Оператор получения свойства, Оператор instanceof, Оператор new
  • 41. 41 Сказка о мутантах •  В далекой-далекой галактике •  Нет привычного нам наследования •  Есть телепатическое наследование –  "Телегенез" •  Действующие лица: –  Дедушка –  Отец –  Сын
  • 44. 44 Дед: хочу стать синим! Color   Дед Отец Сын
  • 46. 46 Отец: верну-ка я цвет Color   Color   Дед Отец Сын
  • 47. 47 Дед синий, отец и сын зеленые Color   Color   Дед Отец Сын
  • 48. 48 Сын: хочу быть черным Color   Color   Color   Дед Отец Сын
  • 49. 49 Мутанты и JavaScript Size,   Age   Color   Объект Свойства прототипа Собственные свойства Делегирование Цепочка прототипов
  • 50. 50 Собственные свойства и прототип •  Собственные свойства •  Свойства прототипа •  Любой объект имеет ссылку на прототип –  И примитив также* –  Имеет с рождения –  По умолчанию – Object.prototype •  Делегирование –  Мы можем пользоваться функциями прототипа не имея собственных •  Цепочка прототипов –  Каждый прототип это тот же объект –  Который также может иметь прототип –  У прототипа прототипа также может быть прототип
  • 51. 51 prototype и __proto__ •  prototype – свойство функции –  Оно есть у функции с рождения –  По умолчанию это пустой объект •  __proto__ – ссылка на prototype у объекта –  Во многих движках JavaScript оно скрыто –  Определяется во время работы оператора new http://es5.github.com/#x15.3.5.2 http://es5.github.com/#x8.6.2
  • 52. 52 Цепочка прототипов это способ наследования в JavaScript
  • 53. 53 Работа оператора new •  new(Constructor, arguments):*! •  Получает на вход 2 операнда –  Функция должна иметь свойство prototype •  Создает временный объект (obj) •  Добавляет свойство __proto__ –  obj.__proto__ = Constructor.prototype •  Вызывает конструктор над объектом –  Constructor.apply(obj, arguments) •  Конструктор вернул примитив. Результат obj •  Иначе то, что вернул конструктор
  • 54. 54 function myNew(Constructor, args) { if (typeof Constructor !== "function") { throw new TypeError(); } if (typeof Constructor.prototype === "undefined") { throw new TypeError(); } var obj = { __proto__: Constructor.prototype }; var result = Constructor.apply(obj, args); if (typeof result === "object" && result !== null || typeof result === "function") { return result; } return obj; } Оператор new в коде
  • 55. 55 Цепочка прототипов // Конструктор Grandfather var Grandfather = function () {}; Grandfather.prototype.color = 'green'; // Конструктор Father var Father = function () {}; typeof Father.prototype === 'object'; // Для цепочки нам нужно получить вот это Father.prototype = { __proto__: Grandfather.prototype };
  • 56. 56 Строим цепочку прототипов явно // Конструктор Father var Father = function () {}; Father.prototype = new Grandfather(); // Как помним, это аналогично: Father.prototype = { __proto__: Grandfather.prototype };
  • 57. 57 Оператор new используется для построения цепочек прототипов
  • 58. 58 Оператор . и [] •  Выполняет поиск свойства •  Использует цепочку прототипов •  Ищет в собственных свойствах •  Затем рекурсивно по ссылке __proto__ •  Если __proto__ null – возвратит undefined http://es5.github.com/#x11.2.1
  • 59. 59 var Foo = function () { // Собственное свойство this.b = 146; }; Foo.prototype.bar = function () { console.log(this); }; Foo.prototype.a = 123; Оператор . и []
  • 60. 60 var foo = new Foo(); foo.__ptoto__ === Foo.prototype; Оператор . и []
  • 61. 61 Оператор . и [] foo b 146 __proto__ object Foo.prototype bar function a 123 __proto__ object Object.prototype __proto__ null http://es5.github.com/#x4.2.1
  • 62. 62 var foo = new Foo(); foo.__ptoto__ === Foo.prototype; foo.bar(); // foo foo.a; // 123 foo['b']; // 146 foo.c; // undefined Foo.prototype.c = 8; foo.c; // 8 <- Magic??? Оператор . и []
  • 63. 63 Оператор instanceof •  Использует цепочку прототипов •  Рекурсивно ищет __proto__ === prototype
  • 64. 64 var Foo = function () { this.b = 146; }; var foo = new Foo(); foo instanceof Foo; // true foo instanceof Object; // true foo instanceof Array; // false Оператор instanceof http://es5.github.com/#x11.8.6
  • 65. 65 Цепочка прототипов foo b 146 __proto__ object Foo.prototype bar function a 123 __proto__ object Object.prototype __proto__ null
  • 66. 66 var Foo = function () { this.b = 146; }; var foo = new Foo(); Foo.prototype.__proto__ = Array.prototype; foo instanceof Array; // true (!) Оператор instanceof http://es5.github.com/#x11.8.6
  • 67. 67 Цепочка прототипов foo b 146 __proto__ object Foo.prototype bar function a 123 __proto__ object Array.prototype __proto__ object Object.prototy
  • 68. Strict Mode На самоподготовку - выделите отличия от обычного режима - всегда ли стоит применять Strict Mode? - в каком месте кода стоит объявлять SM? http://es5.github.com/#x10.1.1
  • 71. Основы и заблуждения насчет JavaScript http://habrahabr.ru/post/120193/