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
39. Синтаксис: eval() == evil
> вызывется в той же области видимости
> хуже по производительности
> потенциальная дыра в безопасности
> используйте заменители когда это возможно
44. Live collections
var divs = document.getElementsByTagName(“div”);
for (var i = 0; i < divs.length; i++) {
var el = divs[i];
el.parentNode.removeChild(el);// хитрая ошибка
}
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
> Периодически опрашиваем сервер
> Помним о висячих соединениях
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
> используйте локальные переменные
> сжимайте свой код обфускатором
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