5.3 KiB
5.3 KiB
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
Функции
function someFunc(x, y, z){
if (x === undefined){
x = 1;
}
y = y || 555;
var a = 25;
return x * y + z / a;
}
или
var someFunc = function(x) {return x * x;}
или
var f = function fact(n){
return n > 1
? n * fact(n-1)
: 1;
};
или
var arr = [1,2,3];
arr.sort(function(left, right) {
return right - left;
});
или если хочется взлома жопы
var square = new Function("x", "return x * x;");
Объекты
Создание
var obj1 = new Object()
var obj = {};
var obj3 = {a: 100;};
Свойства
- Ключ-строка
- Значение - любой тип данных, включая объект
- Флаги: writable, enumerable, configurable
Удаление объекта
delete obj.prop1;
Проверка существования свойства
if ('prop1' in obj){}
if (obj.prop1 === undefined){}
if (obj.hasOwnProperty('prop1')){}
Доступ к свойствам
obj.prop1
obj['prop-2']
obj[p]
Перебор свойств объекта
for (var key in obj) {};
Object.keys(obj);
Массивы
Создание массива
var a = new Array(1.2, "text", true, {x:1});
var b = new Array(10); // массив из undefined
var c = [];
c[0] = 1;
Fun work
var arr = [];
arr[10]= 'hi';
console.log(arr.length); // 11
Методы массивов
- Добавление/удаление
- pop/push (конец)
- shift/unshift (начало)
- Преобразование из строки в массив
- split
- join
- slice
- splice
- sort
Области видимости
Всё как в обычных ЯП
Замыкание
Замыкание = (функция) + внешнее лексическое окружение
function makecount(){
var cur_co = 1;
return function(){
return cur_co++;
};
}
var counter = makecount();
Контекст-this
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, ...]);- создание копии функции, но фиксируется контекст функции и аргументы - карирование
ООП-функциональный стиль
Задание публичного:
- метода
this.getVar = function(){
return _another;
};
- свойства:
this._dem = 1;
Приватное свойство и/или метод задаётся так же, но без this.
Наследование
Базовый класс
function A(){
this.enable = function(){
...
}
...
}
Производный класс
function B(){
Machine.call(this, [, arg1, ...]);
// Machine.apply(this, [, args]);
...
}
Прототипный стиль ООП
Функции остались (блень)
Базовый класс
var car {
fuel: 0.7;
fph: 9.;
ride: function(dist){
...
};
}
Производный класс:
var truck {
longback: true;
__proto__: car;
}
truck.ride();
obj.hasOwnProperty()
Object.getPrototypeOf(obj, [proto])
obj1 instanceof obj2
obj2.isPrototypeOf(obj1)
В прототипном стиле все поля пубичные
Обработка операций
Событийно-ориентированный