Backend Typescript 1.0.0 Help

Основы JavaScript ES5

1. Основной синтаксис

JavaScript — динамически типизируемый язык с синтаксисом, похожим на C. Программы состоят из инструкций, разделяемых точкой с запятой. Пробелы и переносы строк обычно игнорируются синтаксисом, но повышают читаемость.

Переменные объявляются через var и видимы в пределах функции (функциональная область видимости). Присваивание выполняется оператором =. Имена чувствительны к регистру.

// Объявление и присваивание var x = 6; var msg = "Hello"; // Выражение и оператор var sum = x + 4; // 10 console.log(sum); // 10

Операторы — символы/слова, производящие значения: арифметические (+, -, \*, /, %), сравнения (===, !==, <, >, > =, >=), логические (&&, ||, !), тернарный (?:), присваивания (=, +=, …).

// Сравнение и логика var a = 3, b = "3"; console.log(a === b); // false (строгое сравнение) console.log(a == b); // true (нестрогое сравнение: приводит типы) console.log(a < 10 && a > 1); // true

2. Типы данных

В ES5 есть 6 типов: пять примитивов и один ссылочный тип — объект.

  • Примитивы: undefined, null, boolean, number, string.

  • Объекты: коллекции свойств с возможностью иметь методы и прототип.

// typeof — быстрый тест типа (с особенностями) console.log(typeof 42); // "number" console.log(typeof "hi"); // "string" console.log(typeof true); // "boolean" console.log(typeof undefined); // "undefined" console.log(typeof null); // "object" (историческая особенность!) console.log(typeof {}); // "object" console.log(typeof function(){}); // "function" (частный случай объекта)

3. Примитивы

Number в ES5 — это 64-битный формат IEEE-754. Существуют специальные значения: NaN, Infinity, -Infinity.

// NaN "липучий": любые операции с NaN дают NaN console.log(0 / 0); // NaN console.log(NaN === NaN); // false console.log(isNaN("foo")); // true (строка приводится к NaN)

String — неизменяемая последовательность UTF-16 кодовых единиц. Индексация доступна, но менять символы по индексу нельзя.

var s = "Hello"; console.log(s[1]); // "e" s[1] = "A"; console.log(s); // "Hello"

Boolean имеет значения true и false. В логическом контексте примитивы приводятся к булеву значению: «ложные» — 0, NaN, "", null, undefined, false. Остальное — «истинные».

undefined означает «значение не присвоено». null — осознанное «пустое значение».

4. Объекты (ссылочные типы)

Объект — это набор пар «ключ-значение». Ключи — строки. Каждое свойство имеет атрибуты: writable, enumerable, configurable. Объекты связаны цепочкой прототипов.

var user = { name: "Ann", age: 20 }; console.log(user.name); // "Ann" user.role = "admin"; console.log("role" in user); // true
var a = { n: 1 }; var b = a; b.n = 2; console.log(a.n); // 2

5. Подробнее о массивах

Array — это объект со специальным поведением: числовые индексы и свойство length. Массивы могут быть «рваными» (с пропусками индексов).

var arr = [1, 2, 3]; arr.push(4); // [1,2,3,4] var x = arr.pop(); // x=4, [1,2,3] arr.unshift(0); // [0,1,2,3] arr.shift(); // [1,2,3] console.log(arr.length);// 3

Методы обхода ES5: forEach, map, filter, some, every, reduce, reduceRight, indexOf, lastIndexOf, isArray.

// map/filter/reduce var nums = [1,2,3,4]; var doubled = nums.map(function(n){ return n*2; }); // [2,4,6,8] var even = nums.filter(function(n){ return n % 2 === 0; }); // [2,4] var sum = nums.reduce(function(acc,n){ return acc + n; }, 0); // 10 console.log(sum); // 10
// slice/splice var a = [1,2,3,4,5]; console.log(a.slice(1,4)); // [2,3,4] a.splice(2,1,"X"); // a = [1,2,"X",4,5] console.log(a); // [1,2,"X",4,5]

6. Типы преобразований

JS неявно приводит типы согласно внутренним абстрактным операциям ES5:

  • ToBoolean: ложные — 0, NaN, "", null, undefined, false.

  • ToNumber: "42"42, " "0, "foo"NaN, true1.

  • ToString: 42"42", null"null", объект → "[object Object]" по умолчанию.

// Смешение + : число и строка console.log(1 + "2"); // "12" (конкатенация) console.log(1 + 2 + "3"); // "33" console.log("1" + 2 + 3); // "123"

7. Явное и неявное преобразование типов

Явное: используйте конструкторы как функции (Number(x), String(x), Boolean(x)), унарный +, parseInt/parseFloat. Неявное: происходит при сравнении ==, в логических операторах, при конкатенации строк, математике и т.д.

// Явное console.log(Number("10")); // 10 console.log(+ "10"); // 10 console.log(Boolean("")); // false console.log(String(42)); // "42" console.log(parseInt("0xF", 16)); // 15 // Неявное console.log("5" * 2); // 10 (строка стала числом) console.log("5" - 2); // 3 console.log("5" + 2); // "52" (строка победила) console.log(0 == false); // true

8. Область видимости и объявление

Функциональная область: переменные var видны во всей функции. Поднятие (hoisting) означает, что объявления var и function обрабатываются до выполнения кода.

// Hoisting переменной console.log(a); // undefined (объявление поднято, присваивание — нет) var a = 10; // Hoisting функции (declaration) foo(); // "ok" function foo(){ console.log("ok"); } // Выражение функции не поднимает саму инициализацию bar(); // TypeError: bar is not a function var bar = function(){};

Замыкание — функция «запоминает» окружающие переменные на момент создания.

function counter(){ var n = 0; return function(){ n += 1; return n; }; } var c = counter(); console.log(c()); // 1 console.log(c()); // 2
// IIFE для «захвата» i var fns = []; for (var i = 0; i < 3; i++) { (function (j) { fns.push(function () { console.log(j); }); // 0,1,2 })(i); } fns[0](); // 0 fns[1](); // 1 fns[2](); // 2
var obj = { x: 10, getX: function(){ return this.x; } }; var unbound = obj.getX; console.log(unbound()); // undefined в strict, иначе число из глобального контекста var bound = unbound.bind(obj); console.log(bound()); // 10

9. Подробнее об Object

Создание: литерал {} или Object.create(proto) для явного прототипа.

// Прототип от null var dict = Object.create(null); dict.key = "value"; console.log("toString" in dict); // false

Дескрипторы свойств: Object.defineProperty, Object.defineProperties, Object.getOwnPropertyDescriptor.

// Незаписываемое свойство var user = {}; Object.defineProperty(user, "id", { value: 123, writable: false, enumerable: true, configurable: false }); console.log(user.id); // 123 user.id = 456; console.log(user.id); // 123

Геттеры/сеттеры позволяют вычислять значения при чтении/записи.

var point = { _x: 0, get x(){ return this._x; }, set x(v){ if (typeof v === "number") this._x = v; } }; point.x = 5; console.log(point.x); // 5

Статусы расширяемости: Object.preventExtensions, Object.seal, Object.freeze, а также проверки Object.isExtensible, Object.isSealed, Object.isFrozen.

var o = { a: 1 }; Object.freeze(o); o.a = 2; console.log(o.a); // 1
for (var k in o) { if (o.hasOwnProperty(k)) { console.log(k); } }

10. Служебные методы и use strict

Служебные методы ядра ES5:

  • Object.getPrototypeOf(obj) — получить прототип.

  • Object.create(proto, descriptors) — создать с прототипом/дескрипторами.

  • Object.defineProperty/defineProperties — управлять атрибутами.

  • Object.keys(obj), Object.getOwnPropertyNames(obj) — список ключей/всех имён.

  • Array.isArray(value) — проверка массива.

  • Function.prototype.call/apply/bind — явное управление this и аргументами.

  • JSON.parse/JSON.stringify — сериализация данных.

// call/apply function sum(a,b){ return a + b; } console.log(sum.call(null, 2, 3)); // 5 console.log(sum.apply(null, [2, 3])); // 5 // JSON var data = { ok: true, items: [1,2,3] }; var s = JSON.stringify(data); console.log(s); // строка JSON console.log(JSON.parse(s).ok); // true

Строгий режим — директива "use strict" включает более строгие правила интерпретации и раннее обнаружение ошибок.

"use strict"; function demo(){ // Здесь строгий режим return this; // undefined (а не глобальный объект) } console.log(demo() === undefined); // true
  • Запрещены неявные глобальные переменные (присваивание не объявленной переменной вызывает ошибку).

  • Удаление неконфигурируемых свойств — ошибка (delete Object.prototype).

  • Запрещены дублирующиеся имена параметров.

  • Запрещён with, изменение arguments.callee/caller.

  • this в обычной функции — undefined (без new/call/apply/bind).

Last modified: 01 October 2025