910 likes | 1.39k Views
JavaScript. Александр Березневатый , Senior Java Developer & Team Lead. > new Array() + new Array() = ?. > new Array() + new Array() = ‘’. > new Array() + new Array() = “ > new Array() + new Object() = ?. > new Array() + new Array() = “
E N D
JavaScript Александр Березневатый, Senior Java Developer & Team Lead
> 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 > аргументы и локальные переменные
Синтаксис: Функции varmyFunc = function(arg0, arg1) { arguments[0] === arg0;//true arguments[2] === 3;//true }; myFunc(1, 2, 3);
Синтаксис: Функции function iter(fn, array) { for (vari = 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);} varobj = { 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’);
Синтаксис: Прототипы и наследование varJSProgrammer = { skills: ‘javascript’ }; varLuxoftJsProgrammer = function(name, city) { this.name = name; this.city = city || ‘unknown’; }; LuxoftJsProgrammer.prototype = JSProgrammer; var me = new LuxoftJsProgrammer(‘Alex’); assert(me instanceofLuxoftJsProgrammer);
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: eval() == evil > вызывется в той же области видимости > хуже по производительности > потенциальная дыра в безопасности > используйте заменители когда это возможно
Синтаксис: strict mode >"use strict"; > запрещает «скрытые» ошибки > улучшает безопасность кода > не разрешает пользоваться «неправильными» инструментами
Document ><div id=“myElementId”/> > document.getElementById(“myElementId”); > document.getElementsByTagName(“div”); > xpath
Live collections vardivs = document.getElementsByTagName(“div”); for (vari = 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);