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