# LEC 4-5. Java-bruh-script ## History При разработке отталкивался от языков: - Self - диалект Small Talk (первый ООП-подобный язык) - Scheme - функциональное программирование ## Особенности - Мультпарадигменность - Динамическая типизация - Автоматическая работа с памятью и сборка мусора ## Лексическая структура - Unicode - Чувствительность к регистру - Комментарии в C++ style - Необязательность к ; ## Типы данных Простейшие типы: - number (8 byte) - string - boolean Тривиальные типы: - null - undefined Составные типы: - object - array (type of object) Специальные типы: - functions - Стандартные классы - Date - RegExp - Error - Math ## Проверка на равенство и идентичности в JS === - идентичность - максимально строгое сравнение == - равенство - допустимо приведение типов - null and undefined - равны - string -> number ## Преобразование типов - string (String, toString, toFixed, toExponential, toPrecision) - number (Number, parseInt, parseFloat) - default ## Функции ```js function someFunc(x, y, z){ if (x === undefined){ x = 1; } y = y || 555; var a = 25; return x * y + z / a; } ``` или ```js var someFunc = function(x) {return x * x;} ``` или ```js var f = function fact(n){ return n > 1 ? n * fact(n-1) : 1; }; ``` или ```js var arr = [1,2,3]; arr.sort(function(left, right) { return right - left; }); ``` или если хочется взлома ~~жопы~~ ```js var square = new Function("x", "return x * x;"); ``` ## Объекты ### Создание ```js var obj1 = new Object() var obj = {}; var obj3 = {a: 100;}; ``` ### Свойства - Ключ-строка - Значение - любой тип данных, включая объект - Флаги: writable, enumerable, configurable ### Удаление объекта ```js delete obj.prop1; ``` ### Проверка существования свойства ```js if ('prop1' in obj){} if (obj.prop1 === undefined){} if (obj.hasOwnProperty('prop1')){} ``` ### Доступ к свойствам ```js obj.prop1 obj['prop-2'] obj[p] ``` ### Перебор свойств объекта ```js for (var key in obj) {}; Object.keys(obj); ``` ## Массивы ### Создание массива ```js var a = new Array(1.2, "text", true, {x:1}); var b = new Array(10); // массив из undefined var c = []; c[0] = 1; ``` ### Fun work ```js var arr = []; arr[10]= 'hi'; console.log(arr.length); // 11 ``` ### Методы массивов - Добавление/удаление - pop/push (конец) - shift/unshift (начало) - Преобразование из строки в массив - split - join - slice - splice - sort ## Области видимости Всё как в обычных ЯП ## Замыкание Замыкание = (функция) + внешнее лексическое окружение ```js function makecount(){ var cur_co = 1; return function(){ return cur_co++; }; } var counter = makecount(); ``` ## Контекст-this ```js var admin = {name: "PIE"} var user = {name : "CHOCO"} function func(){ alert(this.name) } admin.g = func; user.u = func; admin.g(); // PIE user.u(); // CHOCO func() // undefined ``` ### Манипуляции с контекстом - ```func.call(context, arg1 arg2, ...);``` - вызывает функцию однократно - ```func.apply(context, [arg1, arg2, ...]);``` - то же самое, но с двумя аргументами - ```var wrapper = func.bind(context[, arg1, arg2, ...]);``` - создание копии функции, но фиксируется контекст функции и аргументы - карирование ## ООП-функциональный стиль Задание публичного: - метода ```js this.getVar = function(){ return _another; }; ``` - свойства: ```js this._dem = 1; ``` Приватное свойство и/или метод задаётся так же, но без ```this```. ### Наследование Базовый класс ```js function A(){ this.enable = function(){ ... } ... } ``` Производный класс ```js function B(){ Machine.call(this, [, arg1, ...]); // Machine.apply(this, [, args]); ... } ``` ## Прототипный стиль ООП Функции остались (блень) Базовый класс ```js var car { fuel: 0.7; fph: 9.; ride: function(dist){ ... }; } ``` Производный класс: ```js var truck { longback: true; __proto__: car; } truck.ride(); ``` ```js obj.hasOwnProperty() Object.getPrototypeOf(obj, [proto]) obj1 instanceof obj2 obj2.isPrototypeOf(obj1) ``` В прототипном стиле все поля пубичные ## Обработка операций Событийно-ориентированный