Files
WebBurBurBur/lec/4-5.md
2025-10-30 18:29:08 +03:00

260 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)
```
В прототипном стиле все поля пубичные
## Обработка операций
Событийно-ориентированный