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

5.3 KiB
Raw Permalink Blame History

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)

В прототипном стиле все поля пубичные

Обработка операций

Событийно-ориентированный