SlideShare ist ein Scribd-Unternehmen logo
1 von 90
JavaScript
> new Array() + new Array() = ?
> new Array() + new Array() = ‘’
> new Array() + new Array() = “ 
> new Array() + new Object() = ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object]
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ => true 
> NaN == NaN ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ => true 
> NaN == NaN => false
План дня 
> История Web (продолжение) 
> Синтаксис 
> Работа с DOM 
> Good Parts & Bad Parts 
> Libraries 
> Performance notes 
> Домашнее задание
Цели 
> Общее понимание языка 
> Часто встречающиеся сложности 
> Заинтересовать в изучении 
> Best practice
Жалобы 
> Программирование в браузере это ужас 
> JS тормозит 
> я плохо знаю JS 
> JS просто большая куча ошибок
История: JavaScript 
> Разработан за две недели 
> Много чего бездумно скопировано 
> Пострадал в результате войны браузеров 
> Стандартизируется ECMA + W3C
Синтаксис
Синтаксис: Объекты 
> неупорядоченный набор свойств 
> var x = new Object() 
> var y = {};
Синтаксис: JSON 
> очень краткий и емкий формат 
> {}, [] 
> свойства в кавычках
Синтаксис: JSON 
{ 
“status” : “success” 
“result” : [ 
12, 22, { “id”: 45, “name”: “Alex” } 
] 
}
Синтаксис: Функции 
> функция тоже объект 
> ключевое слово function 
> аргументы и локальные переменные
Синтаксис: Функции 
var myFunc = function(arg0, arg1) { 
arguments[0] === arg0;//true 
arguments[2] === 3;//true 
}; 
myFunc(1, 2, 3);
Синтаксис: Функции 
function iter(fn, array) { 
for (var i = 0; i < array.length; i++) { 
fn(array[i]); 
} 
}; 
iter(function(el){ 
alert(el); 
}, 
[1, 2, 3, 4]);
Синтаксис: Глобальный контекст 
> глобальные переменные это свойства 
объекта window 
> ключевое слово var 
> ключевое слово delete
Синтаксис: Видимость переменных 
> ключевое слово var (продолжение) 
> цепочки скоупов 
> ключевое слово with
Синтаксис: Видимость переменных
Синтаксис: Контекст 
> ключевое слово this 
> варианты контекста 
> методы call и apply
Синтаксис: Контекст 
function myFunc() { 
console.log(this); 
} 
var obj = { method : myFunc }; 
myFunc(); // this === window 
obj.method(); // this === obj 
obj.method.call(document); // this === document 
obj.method.apply(console); // this === console
Синтаксис: Прототипы и наследование 
> наследуются объекты 
> цепочки свойств 
> перезапись и удаление свойств
Синтаксис: Прототипы и наследование 
var x = { 
name: ‘Alex’ 
}; 
var y = {}; 
assert(y.name === undefined); 
y.prototype = x; 
assert(y.name === x.name); 
y.name = ‘Sasha’; 
assert(y.name === ‘Sasha’); 
assert(x.name === ‘Alex’);
Синтаксис: Прототипы и наследование 
var JSProgrammer = { 
skills: ‘javascript’ 
}; 
var LuxoftJsProgrammer = function(name, city) { 
this.name = name; 
this.city = city || ‘unknown’; 
}; 
LuxoftJsProgrammer.prototype = JSProgrammer; 
var me = new LuxoftJsProgrammer(‘Alex’); 
assert(me instanceof LuxoftJsProgrammer);
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: eval() == evil 
> вызывется в той же области видимости 
> хуже по производительности 
> потенциальная дыра в безопасности 
> используйте заменители когда это возможно
Синтаксис: strict mode 
> "use strict"; 
> запрещает «скрытые» ошибки 
> улучшает безопасность кода 
> не разрешает пользоваться 
«неправильными» инструментами
Синтаксис: Вопросы
Работа с DOM
Document 
> <div id=“myElementId”/> 
> document.getElementById(“myElementId”); 
> document.getElementsByTagName(“div”); 
> xpath
Live collections 
var divs = document.getElementsByTagName(“div”); 
for (var i = 0; i < divs.length; i++) { 
var el = divs[i]; 
el.parentNode.removeChild(el);// хитрая ошибка 
}
Node 
> Document, Element, TextNode 
> appendChild/removeChild 
> firstChild/lastChild 
> childNodes 
> getAttribute/setAttribute
Window 
> setTimeout/clearTimeout 
> концепция кадров 
> Некоторый контроль над браузером 
> alert/confirm/prompt
События 
> addEventListener/attachEvent 
> фазы просачивания и перехвата 
> удаление обработчиков 
> не используйте html аттрибуты!
События
События 
function on(el, event, fn) { 
if (el.addEventListener) { 
el.addEventListener(event, fn, false); 
} else if (el.attachEvent) { 
el.attachEvent(‘on’ + event, fn); 
} else { 
// выдать ошибку – странный браузер 
} 
} 
on(element, ‘click’, function() { 
alert(‘Hi’); 
});
События 
element.addEventListener(‘click’, function() { 
alert(‘hi’); 
}, false); 
// … 
// скрытая ошибка 
element.removeEventListener(‘click’, function() { 
alert(‘hi’); 
}, false);
События 
var listener = function() { 
alert(‘hi’); 
}; 
element.addEventListener(‘click’, listener, false); 
// … 
element.removeEventListener(‘click’, listener, false);
Стили 
> element.style.borderBottom = “1px solid red”; 
> document.defaultView (хорошие браузеры) 
> element.currentStyle (только IE)
Reflow 
for (var i = 0; i < array.length; i++) { 
element.innerHTML += array[i]; // возможен reflow 
if (element.offsetWidth > 50) { // тут уж точно reflow 
// do something 
} 
}
AJAX 
> Asynchronous JavaScript And XML 
> Баги и особенности в разных браузерах 
> Используйте библиотечные реализации
Comet 
> server push 
> Периодически опрашиваем сервер 
> Помним о висячих соединениях
DOM: Вопросы
Best practices
Bad parts 
> Глобальные переменные 
> Оператор + 
> typeof 
> with и eval 
> Ложные массивы 
> == и != 
> false, null, undefined, NaN 
> Автоматическая вставка ;
Bad parts 
function myFunc() { 
return { 
ok: true 
}; 
}
Bad parts 
function myFunc() { 
return 
{ 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; // упс 
{ 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ // блок 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false // label 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false // бессмысленный оператор 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false; 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false; 
}; // пустой оператор 
}
Bad parts 
function myFunc() { 
return; 
// код недостижим, но JS промолчит 
{ 
ok: false; 
}; 
}
Bad parts
Good parts 
> функции, замыкания 
> операторы || и && 
> JSON, {}, [] 
> динамические объекты и типы 
> JSLint
Good parts
Патерны: локальная глобальность 
(function(window, undefined) { 
var document = window.document, 
navigator = window.navigator, 
location = window.location; 
// ваш код 
}) (window);
Патерны: синглетон 
var singleton = (function() { 
var privateVar = 3; 
return { 
publicFn: function(arg) { 
return arg + privateVar; 
} 
}; 
}) (); 
singleton.publicFn(5);
Патерны: callback 
Array.prototype.each = function(fn) { 
for (int i = 0; i < this.length; i++) { 
fn.call(this, this[i], i); 
} 
}; 
var myNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; 
myNumbers.each(function(el, i) { 
// this === myNumbers 
});
Патерны: условные операторы 
function(arg1, arg2) { 
var name = arg1 || arg2 || ‘unknown’; 
// вместо: 
var other = arg1; 
if (!other) { 
other = arg2; 
} 
if (!other) { 
other = ‘unknown’; 
} 
}
Патерны: длинный список параметров 
// кривовато: 
function fn(arg1,arg2, arg3, arg4, arg5, arg6 …); 
// лучше: 
function fn(cfg) { 
cfg.arg1, cfg.arg2… 
} 
fn({ 
arg1: ‘ss’ 
});
Патерны: полиморфные функции 
function ajax(url, fn) { 
var method = ‘get’; 
if (typeof(url) !== ‘string’) { 
method = url.method; 
fn = url.fn; url = url.url; 
} 
// do ajax … 
} 
ajax(‘myUrl’, myCallback); 
ajax({ 
method: ‘post’, 
url: ‘myUrl’, 
fn: myCallback 
});
Патерны: цепочечные вызовы 
var obj = { 
initialize : function() { 
return this; 
}, 
animate : function() { 
return delayController; 
} 
}; 
obj.initialize().animate().oncomplete(function(){ 
// работа по завершению анимации 
});
Performance 
> контролируйте reflow 
> помните о живых колекциях 
> осторожно работайте с DOM 
> пользуйтесь DocumentFragment 
> используйте локальные переменные 
> сжимайте свой код обфускатором
Отладка 
> FireBug, Draggonfly, WebInspector 
> IE: Visual Studio, Companion.JS, DebugBar 
> debugger 
> console.log() 
> Старые добрые window.alert()
Best Practices: Вопросы
Libraries: JQuery 
> Легковесная, простая, мощная 
> Основана на селекторах близких к CSS 
> Практикует «ненавязчивость»
Libraries: JQuery 
$(“#myButtonId”).click( function(){ 
$.ajax(“/myActionUrl”).done(function(response) { 
var el = $(“<div>”); 
el.html(response); 
$(“#results”).append(el); 
}); 
});
Libraries: ExtJS 
> Тяжелая библиотека компонентов 
> Легка в освоении 
> Хорошая архитектура 
> Много компонентов out-of-box
Libraries: ExtJS 
Ext.create('Ext.window.Window', { 
title: 'Hello', 
height: 200, 
width: 400, 
layout: 'fit', 
items: { 
xtype: 'grid', 
border: false, 
columns: [{header: 'World'}], 
store: Ext.create('Ext.data.ArrayStore', {}) 
} 
}).show();
Libraries 
> Dojo 
> Prototype 
> SmartClient 
> GWT
Что упустили? 
> Наследование (подробнее) 
> Детали синтаксиса 
> Система типов 
> Многое другое
Что почитать? 
> Дэвид Флэнаган: JavaScript. Подробное руководство 
> JavaScript: The Good Parts. Douglas Crockford 
> High Performance JavaScript. Nicholas C. Zakas 
> http://jonraasch.com/blog/10-javascript-performance-boosting- 
tips-from-nicholas-zakas 
> http://learn.jquery.com/ 
> https://developer.mozilla.org/ru/ 
> http://w3fools.com
Что посмотреть? 
> The Good Parts. http://www.youtube.com/watch? 
v=hQVTIJBZook 
> Speed up you javascript 
http://www.youtube.com/watch?v=mHtdZgou0qU 
> 10 things I’ve learned from jquery source 
http://www.youtube.com/watch?v=i_qE1iAmjFg
Вопросы
Домашнее задание 
> прикручиваем джаваскрипт к нашему 
toprankу 
> используем JQuery

Weitere ähnliche Inhalte

Was ist angesagt?

Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибокoelifantiev
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

Was ist angesagt? (20)

Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
PHP basic
PHP basicPHP basic
PHP basic
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Yii development
Yii developmentYii development
Yii development
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

Andere mochten auch

AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScriptDmitry Soshnikov
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJS
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
"Как написать компилятор за 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
 
Классические архитектуры во фронтенде / Александра Шинкевич (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
 

Andere mochten auch (15)

AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScript
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
 
доклад
докладдоклад
доклад
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
"Как написать компилятор за 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 издание)
 
Классические архитектуры во фронтенде / Александра Шинкевич (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
 

Ähnlich wie Подробная презентация JavaScript 6 в 1

Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9Technopark
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15MoscowJS
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)Mikhail Davydov
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 

Ähnlich wie Подробная презентация JavaScript 6 в 1 (20)

Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9
 
course js day 2
course js day 2course js day 2
course js day 2
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)
 
course js day 4
course js day 4course js day 4
course js day 4
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 

Mehr von Vasya Petrov

Настройка Apache и PHP
Настройка Apache и PHPНастройка Apache и PHP
Настройка Apache и PHPVasya Petrov
 
Создание сайта на PHP
Создание сайта на PHPСоздание сайта на PHP
Создание сайта на PHPVasya Petrov
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHPVasya Petrov
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHPVasya Petrov
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотекаVasya Petrov
 
Оптимизация CSS
Оптимизация CSSОптимизация CSS
Оптимизация CSSVasya Petrov
 
Основные теги HTML
Основные теги HTMLОсновные теги HTML
Основные теги HTMLVasya Petrov
 
Работа с текстом в HTML
Работа с текстом в HTMLРабота с текстом в HTML
Работа с текстом в HTMLVasya Petrov
 
Rabota s massivami_v_php
Rabota s massivami_v_phpRabota s massivami_v_php
Rabota s massivami_v_phpVasya Petrov
 
Rabota so strokami_v_php
Rabota so strokami_v_phpRabota so strokami_v_php
Rabota so strokami_v_phpVasya Petrov
 
Внедрение CSS в HTML документ
Внедрение CSS в HTML документВнедрение CSS в HTML документ
Внедрение CSS в HTML документVasya Petrov
 
CSS Язык описания представлений
CSS Язык описания представленийCSS Язык описания представлений
CSS Язык описания представленийVasya Petrov
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 
Таблицы Html
Таблицы HtmlТаблицы Html
Таблицы HtmlVasya Petrov
 

Mehr von Vasya Petrov (20)

О школе
О школеО школе
О школе
 
Настройка Apache и PHP
Настройка Apache и PHPНастройка Apache и PHP
Настройка Apache и PHP
 
Создание сайта на PHP
Создание сайта на PHPСоздание сайта на PHP
Создание сайта на PHP
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHP
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHP
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Оптимизация CSS
Оптимизация CSSОптимизация CSS
Оптимизация CSS
 
633942
633942633942
633942
 
Основные теги HTML
Основные теги HTMLОсновные теги HTML
Основные теги HTML
 
Работа с текстом в HTML
Работа с текстом в HTMLРабота с текстом в HTML
Работа с текстом в HTML
 
Rabota s massivami_v_php
Rabota s massivami_v_phpRabota s massivami_v_php
Rabota s massivami_v_php
 
Rabota so strokami_v_php
Rabota so strokami_v_phpRabota so strokami_v_php
Rabota so strokami_v_php
 
Внедрение CSS в HTML документ
Внедрение CSS в HTML документВнедрение CSS в HTML документ
Внедрение CSS в HTML документ
 
Tables frames
Tables framesTables frames
Tables frames
 
CSS Язык описания представлений
CSS Язык описания представленийCSS Язык описания представлений
CSS Язык описания представлений
 
массивы Php
массивы Phpмассивы Php
массивы Php
 
Таблицы Html
Таблицы HtmlТаблицы Html
Таблицы Html
 
еще JavaScript
еще JavaScriptеще JavaScript
еще JavaScript
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Html списки
Html спискиHtml списки
Html списки
 

Подробная презентация JavaScript 6 в 1

  • 2.
  • 3. > new Array() + new Array() = ?
  • 4. > new Array() + new Array() = ‘’
  • 5. > new Array() + new Array() = “ > new Array() + new Object() = ?
  • 6. > new Array() + new Array() = “ > new Array() + new Object() = [object Object]
  • 7. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ ?
  • 8. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ ?
  • 9. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false ?
  • 10. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false ?
  • 11. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ ?
  • 12. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ => true > NaN == NaN ?
  • 13. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ => true > NaN == NaN => false
  • 14.
  • 15. План дня > История Web (продолжение) > Синтаксис > Работа с DOM > Good Parts & Bad Parts > Libraries > Performance notes > Домашнее задание
  • 16. Цели > Общее понимание языка > Часто встречающиеся сложности > Заинтересовать в изучении > Best practice
  • 17. Жалобы > Программирование в браузере это ужас > JS тормозит > я плохо знаю JS > JS просто большая куча ошибок
  • 18.
  • 19. История: JavaScript > Разработан за две недели > Много чего бездумно скопировано > Пострадал в результате войны браузеров > Стандартизируется ECMA + W3C
  • 20.
  • 22. Синтаксис: Объекты > неупорядоченный набор свойств > var x = new Object() > var y = {};
  • 23. Синтаксис: JSON > очень краткий и емкий формат > {}, [] > свойства в кавычках
  • 24. Синтаксис: JSON { “status” : “success” “result” : [ 12, 22, { “id”: 45, “name”: “Alex” } ] }
  • 25. Синтаксис: Функции > функция тоже объект > ключевое слово function > аргументы и локальные переменные
  • 26. Синтаксис: Функции var myFunc = function(arg0, arg1) { arguments[0] === arg0;//true arguments[2] === 3;//true }; myFunc(1, 2, 3);
  • 27. Синтаксис: Функции function iter(fn, array) { for (var i = 0; i < array.length; i++) { fn(array[i]); } }; iter(function(el){ alert(el); }, [1, 2, 3, 4]);
  • 28. Синтаксис: Глобальный контекст > глобальные переменные это свойства объекта window > ключевое слово var > ключевое слово delete
  • 29. Синтаксис: Видимость переменных > ключевое слово var (продолжение) > цепочки скоупов > ключевое слово with
  • 31. Синтаксис: Контекст > ключевое слово this > варианты контекста > методы call и apply
  • 32. Синтаксис: Контекст function myFunc() { console.log(this); } var obj = { method : myFunc }; myFunc(); // this === window obj.method(); // this === obj obj.method.call(document); // this === document obj.method.apply(console); // this === console
  • 33. Синтаксис: Прототипы и наследование > наследуются объекты > цепочки свойств > перезапись и удаление свойств
  • 34. Синтаксис: Прототипы и наследование var x = { name: ‘Alex’ }; var y = {}; assert(y.name === undefined); y.prototype = x; assert(y.name === x.name); y.name = ‘Sasha’; assert(y.name === ‘Sasha’); assert(x.name === ‘Alex’);
  • 35. Синтаксис: Прототипы и наследование var JSProgrammer = { skills: ‘javascript’ }; var LuxoftJsProgrammer = function(name, city) { this.name = name; this.city = city || ‘unknown’; }; LuxoftJsProgrammer.prototype = JSProgrammer; var me = new LuxoftJsProgrammer(‘Alex’); assert(me instanceof LuxoftJsProgrammer);
  • 36. Синтаксис: Прототипы и наследование
  • 37. Синтаксис: Прототипы и наследование
  • 38. Синтаксис: Прототипы и наследование
  • 39. Синтаксис: eval() == evil > вызывется в той же области видимости > хуже по производительности > потенциальная дыра в безопасности > используйте заменители когда это возможно
  • 40. Синтаксис: strict mode > "use strict"; > запрещает «скрытые» ошибки > улучшает безопасность кода > не разрешает пользоваться «неправильными» инструментами
  • 43. Document > <div id=“myElementId”/> > document.getElementById(“myElementId”); > document.getElementsByTagName(“div”); > xpath
  • 44. Live collections var divs = document.getElementsByTagName(“div”); for (var i = 0; i < divs.length; i++) { var el = divs[i]; el.parentNode.removeChild(el);// хитрая ошибка }
  • 45. Node > Document, Element, TextNode > appendChild/removeChild > firstChild/lastChild > childNodes > getAttribute/setAttribute
  • 46. Window > setTimeout/clearTimeout > концепция кадров > Некоторый контроль над браузером > alert/confirm/prompt
  • 47. События > addEventListener/attachEvent > фазы просачивания и перехвата > удаление обработчиков > не используйте html аттрибуты!
  • 49. События function on(el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); } else if (el.attachEvent) { el.attachEvent(‘on’ + event, fn); } else { // выдать ошибку – странный браузер } } on(element, ‘click’, function() { alert(‘Hi’); });
  • 50. События element.addEventListener(‘click’, function() { alert(‘hi’); }, false); // … // скрытая ошибка element.removeEventListener(‘click’, function() { alert(‘hi’); }, false);
  • 51. События var listener = function() { alert(‘hi’); }; element.addEventListener(‘click’, listener, false); // … element.removeEventListener(‘click’, listener, false);
  • 52. Стили > element.style.borderBottom = “1px solid red”; > document.defaultView (хорошие браузеры) > element.currentStyle (только IE)
  • 53. Reflow for (var i = 0; i < array.length; i++) { element.innerHTML += array[i]; // возможен reflow if (element.offsetWidth > 50) { // тут уж точно reflow // do something } }
  • 54. AJAX > Asynchronous JavaScript And XML > Баги и особенности в разных браузерах > Используйте библиотечные реализации
  • 55. Comet > server push > Периодически опрашиваем сервер > Помним о висячих соединениях
  • 58. Bad parts > Глобальные переменные > Оператор + > typeof > with и eval > Ложные массивы > == и != > false, null, undefined, NaN > Автоматическая вставка ;
  • 59. Bad parts function myFunc() { return { ok: true }; }
  • 60. Bad parts function myFunc() { return { ok: false }; }
  • 61. Bad parts function myFunc() { return; // упс { ok: false }; }
  • 62. Bad parts function myFunc() { return; { // блок ok: false }; }
  • 63. Bad parts function myFunc() { return; { ok: false // label }; }
  • 64. Bad parts function myFunc() { return; { ok: false // бессмысленный оператор }; }
  • 65. Bad parts function myFunc() { return; { ok: false; }; }
  • 66. Bad parts function myFunc() { return; { ok: false; }; // пустой оператор }
  • 67. Bad parts function myFunc() { return; // код недостижим, но JS промолчит { ok: false; }; }
  • 69. Good parts > функции, замыкания > операторы || и && > JSON, {}, [] > динамические объекты и типы > JSLint
  • 71. Патерны: локальная глобальность (function(window, undefined) { var document = window.document, navigator = window.navigator, location = window.location; // ваш код }) (window);
  • 72. Патерны: синглетон var singleton = (function() { var privateVar = 3; return { publicFn: function(arg) { return arg + privateVar; } }; }) (); singleton.publicFn(5);
  • 73. Патерны: callback Array.prototype.each = function(fn) { for (int i = 0; i < this.length; i++) { fn.call(this, this[i], i); } }; var myNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; myNumbers.each(function(el, i) { // this === myNumbers });
  • 74. Патерны: условные операторы function(arg1, arg2) { var name = arg1 || arg2 || ‘unknown’; // вместо: var other = arg1; if (!other) { other = arg2; } if (!other) { other = ‘unknown’; } }
  • 75. Патерны: длинный список параметров // кривовато: function fn(arg1,arg2, arg3, arg4, arg5, arg6 …); // лучше: function fn(cfg) { cfg.arg1, cfg.arg2… } fn({ arg1: ‘ss’ });
  • 76. Патерны: полиморфные функции function ajax(url, fn) { var method = ‘get’; if (typeof(url) !== ‘string’) { method = url.method; fn = url.fn; url = url.url; } // do ajax … } ajax(‘myUrl’, myCallback); ajax({ method: ‘post’, url: ‘myUrl’, fn: myCallback });
  • 77. Патерны: цепочечные вызовы var obj = { initialize : function() { return this; }, animate : function() { return delayController; } }; obj.initialize().animate().oncomplete(function(){ // работа по завершению анимации });
  • 78. Performance > контролируйте reflow > помните о живых колекциях > осторожно работайте с DOM > пользуйтесь DocumentFragment > используйте локальные переменные > сжимайте свой код обфускатором
  • 79. Отладка > FireBug, Draggonfly, WebInspector > IE: Visual Studio, Companion.JS, DebugBar > debugger > console.log() > Старые добрые window.alert()
  • 81. Libraries: JQuery > Легковесная, простая, мощная > Основана на селекторах близких к CSS > Практикует «ненавязчивость»
  • 82. Libraries: JQuery $(“#myButtonId”).click( function(){ $.ajax(“/myActionUrl”).done(function(response) { var el = $(“<div>”); el.html(response); $(“#results”).append(el); }); });
  • 83. Libraries: ExtJS > Тяжелая библиотека компонентов > Легка в освоении > Хорошая архитектура > Много компонентов out-of-box
  • 84. Libraries: ExtJS Ext.create('Ext.window.Window', { title: 'Hello', height: 200, width: 400, layout: 'fit', items: { xtype: 'grid', border: false, columns: [{header: 'World'}], store: Ext.create('Ext.data.ArrayStore', {}) } }).show();
  • 85. Libraries > Dojo > Prototype > SmartClient > GWT
  • 86. Что упустили? > Наследование (подробнее) > Детали синтаксиса > Система типов > Многое другое
  • 87. Что почитать? > Дэвид Флэнаган: JavaScript. Подробное руководство > JavaScript: The Good Parts. Douglas Crockford > High Performance JavaScript. Nicholas C. Zakas > http://jonraasch.com/blog/10-javascript-performance-boosting- tips-from-nicholas-zakas > http://learn.jquery.com/ > https://developer.mozilla.org/ru/ > http://w3fools.com
  • 88. Что посмотреть? > The Good Parts. http://www.youtube.com/watch? v=hQVTIJBZook > Speed up you javascript http://www.youtube.com/watch?v=mHtdZgou0qU > 10 things I’ve learned from jquery source http://www.youtube.com/watch?v=i_qE1iAmjFg
  • 90. Домашнее задание > прикручиваем джаваскрипт к нашему toprankу > используем JQuery

Hinweis der Redaktion

  1. 12/7/14 &amp;lt;number&amp;gt;
  2. 12/7/14 &amp;lt;number&amp;gt;
  3. 12/7/14 &amp;lt;number&amp;gt;
  4. 12/7/14 &amp;lt;number&amp;gt;
  5. 12/7/14 &amp;lt;number&amp;gt;
  6. 12/7/14 &amp;lt;number&amp;gt;
  7. 12/7/14 &amp;lt;number&amp;gt;
  8. 12/7/14 &amp;lt;number&amp;gt;
  9. 12/7/14 &amp;lt;number&amp;gt;
  10. 12/7/14 &amp;lt;number&amp;gt;
  11. 12/7/14 &amp;lt;number&amp;gt;
  12. 12/7/14 &amp;lt;number&amp;gt;
  13. 12/7/14 &amp;lt;number&amp;gt;
  14. 12/7/14 &amp;lt;number&amp;gt;
  15. 12/7/14 &amp;lt;number&amp;gt;
  16. 12/7/14 &amp;lt;number&amp;gt;
  17. 12/7/14 &amp;lt;number&amp;gt;
  18. 12/7/14 &amp;lt;number&amp;gt;
  19. 12/7/14 &amp;lt;number&amp;gt;
  20. 12/7/14 &amp;lt;number&amp;gt;
  21. 12/7/14 &amp;lt;number&amp;gt;
  22. 12/7/14 &amp;lt;number&amp;gt;
  23. 12/7/14 &amp;lt;number&amp;gt;
  24. 12/7/14 &amp;lt;number&amp;gt;
  25. 12/7/14 &amp;lt;number&amp;gt;
  26. 12/7/14 &amp;lt;number&amp;gt;
  27. 12/7/14 &amp;lt;number&amp;gt;
  28. 12/7/14 &amp;lt;number&amp;gt;
  29. 12/7/14 &amp;lt;number&amp;gt;
  30. 12/7/14 &amp;lt;number&amp;gt;
  31. 12/7/14 &amp;lt;number&amp;gt;
  32. 12/7/14 &amp;lt;number&amp;gt;
  33. 12/7/14 &amp;lt;number&amp;gt;
  34. 12/7/14 &amp;lt;number&amp;gt;
  35. 12/7/14 &amp;lt;number&amp;gt;
  36. 12/7/14 &amp;lt;number&amp;gt;
  37. 12/7/14 &amp;lt;number&amp;gt;
  38. 12/7/14 &amp;lt;number&amp;gt;
  39. 12/7/14 &amp;lt;number&amp;gt;
  40. 12/7/14 &amp;lt;number&amp;gt;
  41. 12/7/14 &amp;lt;number&amp;gt;
  42. 12/7/14 &amp;lt;number&amp;gt;
  43. 12/7/14 &amp;lt;number&amp;gt;
  44. 12/7/14 &amp;lt;number&amp;gt;
  45. 12/7/14 &amp;lt;number&amp;gt;
  46. 12/7/14 &amp;lt;number&amp;gt;
  47. 12/7/14 &amp;lt;number&amp;gt;
  48. 12/7/14 &amp;lt;number&amp;gt;
  49. 12/7/14 &amp;lt;number&amp;gt;
  50. 12/7/14 &amp;lt;number&amp;gt;
  51. 12/7/14 &amp;lt;number&amp;gt;
  52. 12/7/14 &amp;lt;number&amp;gt;
  53. 12/7/14 &amp;lt;number&amp;gt;
  54. 12/7/14 &amp;lt;number&amp;gt;
  55. 12/7/14 &amp;lt;number&amp;gt;
  56. 12/7/14 &amp;lt;number&amp;gt;
  57. 12/7/14 &amp;lt;number&amp;gt;
  58. 12/7/14 &amp;lt;number&amp;gt;
  59. 12/7/14 &amp;lt;number&amp;gt;
  60. 12/7/14 &amp;lt;number&amp;gt;
  61. 12/7/14 &amp;lt;number&amp;gt;
  62. 12/7/14 &amp;lt;number&amp;gt;
  63. 12/7/14 &amp;lt;number&amp;gt;
  64. 12/7/14 &amp;lt;number&amp;gt;
  65. 12/7/14 &amp;lt;number&amp;gt;
  66. 12/7/14 &amp;lt;number&amp;gt;
  67. 12/7/14 &amp;lt;number&amp;gt;
  68. 12/7/14 &amp;lt;number&amp;gt;
  69. 12/7/14 &amp;lt;number&amp;gt;
  70. 12/7/14 &amp;lt;number&amp;gt;
  71. 12/7/14 &amp;lt;number&amp;gt;
  72. 12/7/14 &amp;lt;number&amp;gt;
  73. 12/7/14 &amp;lt;number&amp;gt;
  74. 12/7/14 &amp;lt;number&amp;gt;
  75. 12/7/14 &amp;lt;number&amp;gt;
  76. 12/7/14 &amp;lt;number&amp;gt;
  77. 12/7/14 &amp;lt;number&amp;gt;
  78. 12/7/14 &amp;lt;number&amp;gt;
  79. 12/7/14 &amp;lt;number&amp;gt;
  80. 12/7/14 &amp;lt;number&amp;gt;
  81. 12/7/14 &amp;lt;number&amp;gt;
  82. 12/7/14 &amp;lt;number&amp;gt;
  83. 12/7/14 &amp;lt;number&amp;gt;
  84. 12/7/14 &amp;lt;number&amp;gt;
  85. 12/7/14 &amp;lt;number&amp;gt;
  86. 12/7/14 &amp;lt;number&amp;gt;
  87. 12/7/14 &amp;lt;number&amp;gt;
  88. 12/7/14 &amp;lt;number&amp;gt;
  89. 12/7/14 &amp;lt;number&amp;gt;
  90. 12/7/14 &amp;lt;number&amp;gt;