Към съдържанието
wannacode

Променливи и типове

Проблем

Цената е на три места

В онлайн магазина една цена се появява на няколко места: в каталога, в количката и при плащането. Ако е написана навсякъде с числа, ето какво става:

console.log("Слушалки: 49.90 €");
console.log("В количката: слушалки, 49.90 €");
console.log("За плащане: 49.90 €");

Утре слушалките са в намаление. Трябва да намериш и поправиш всяко 49.90. Пропуснеш ли едно, клиентът вижда две различни цени.

Идеята

Променлива: име за стойност

Запиши цената веднъж и ѝ дай име. После навсякъде пиши името.

const price = 49.90;
console.log("Слушалки: " + price + " €");
console.log("В количката: слушалки, " + price + " €");
console.log("За плащане: " + price + " €");
Изход
Слушалки: 49.9 €
В количката: слушалки, 49.9 €
За плащане: 49.9 €

const price = 49.90; създава променлива: име (price), под което програмата пази стойност (49.90). Където в кода пише price, програмата взима стойността оттам. const значи, че стойността няма да се сменя. За стойност, която се сменя, има let: ще го видиш след малко. Типа не пишеш: JavaScript го вижда от стойността.

+ между текст и стойност ги слепва в един текст. Затова интервалите са вътре в кавичките.

Нулата накрая изчезна: 49.90 излезе като 49.9. За числото това е едно и също. Как да покажеш цената с два знака след запетаята, ще видим в урока за вход и изход.

По-точно, за любопитните
  • Името започва с буква, без интервали. Пиши го с малка буква, а всяка следваща дума с главна: price, pricePerNight. Главните и малките букви имат значение: price и Price са две различни имена.
  • Езикът позволява и имена на кирилица (цена), но не го прави. Целият код по света е с латински имена и така ще пишат и колегите ти.
  • Име, което не е създадено с const или let, спира програмата с ReferenceError: price is not defined. let total; без стойност е позволено: тогава в total има undefined, „няма стойност“.

Идеята

Видове стойности

Типът казва какво може да пази променливата. Ето основните:

const name = "Раница";
const price = 39.90;
const stock = 12;
const onSale = true;
const size = "M";
console.log(name + ", размер " + size);
console.log("Цена: " + price + " €");
console.log("Наличност: " + stock + " бр.");
console.log("Намаление: " + onSale);
Изход
Раница, размер M
Цена: 39.9 €
Наличност: 12 бр.
Намаление: true
  • number: всяко число, цяло или дробно: брой, цена, тегло. В кода десетичният знак е точка: 39.90. JavaScript няма отделен тип за цели числа.
  • boolean: да или не, true или false.
  • string: текст, в кавички: "Раница". Това е низ (string), поредица от символи. Отделен тип за един символ няма: "M" е текст с дължина 1.

typeof казва типа на стойност. Ако допишеш тези редове в същата програма:

console.log(typeof name);
console.log(typeof price);
console.log(typeof stock);
console.log(typeof onSale);
console.log(typeof size);
Изход
string
number
number
boolean
string
По-точно, за любопитните

number е дробно число в 8 байта, като double в Java и C#. Целите числа в него са точни до Number.MAX_SAFE_INTEGER, 9 007 199 254 740 991. След това не всяко цяло число може да се запише и 9007199254740993 става ...992. За по-големи цели числа има отделен тип, BigInt: число с n накрая. Долна черта между цифрите само помага да се четат:

const population = 8_100_000_000;
const weight = 1.5;
console.log(population + " " + weight);
console.log(Number.MAX_SAFE_INTEGER);
console.log(9007199254740993);
console.log(9007199254740993n);
Изход
8100000000 1.5
9007199254740991
9007199254740992
9007199254740993n

number пази числата в двоична система и някои дробни стойности като 0.1 не стават точно: 0.1 + 0.2 е 0.30000000000000004. Затова истинските програми пазят парите в цели стотинки (центове). В курса за кратко пишем цените като number.

Пробвай

Намери грешката

Програмата трябва да отпечата една покупка. Тя не тръгва: Node.js казва SyntaxError. На кой ред е грешката?

Избери реда с грешката.

Идеята

= записва копие

Знакът = не е „равно“ като в математиката. Той значи: вземи стойността отдясно и я запиши в променливата отляво. Това се казва присвояване. Старата стойност на променливата изчезва.

Когато отдясно е друга променлива, записва се копие на стойността ѝ в този момент. Двете променливи не остават свързани:

let seats = 40;
const seatsAtStart = seats;
seats = 37;
console.log("В началото: " + seatsAtStart);
console.log("Сега: " + seats);
Изход
В началото: 40
Сега: 37

seatsAtStart получава 40. После seats става 37, но копието в seatsAtStart си остава 40.

seats е с let, защото стойността ѝ се сменя. seatsAtStart е с const: тя само помни началото.

Пробвай

Коя стойност остава?

Какво ще отпечата програмата?

let roomA = 12;
let roomB = 20;
roomA = roomB;
roomB = 25;
console.log(roomA + " и " + roomB);
Отговор

Проблем

Размерите са разменени

Програма за печат на снимки получава размерите разменени: ширина 120 и височина 80, а трябва да са 80 x 120. Изглежда, че стига да запишеш едното в другото и обратно:

let width = 120;
let height = 80;
width = height;
height = width;
console.log(width + " x " + height);
Изход
80 x 80

Излезе 80 x 80. Къде отиде 120?

Виж го

Размяна с помощна променлива

let width = 120;
let height = 80;
const temp = width;
width = height;
height = temp;
console.log(width + " x " + height); // 80 x 120
Стъпка по стъпка, с думи
  1. Ширината и височината са въведени разменени: 120 и 80.
  2. temp = width: копие на 120 отива в temp. В width си остава 120.
  3. width = height: копие на 80 влиза в width. Старото 120 оттам изчезва, но е запазено в temp.
  4. height = temp: 120 се връща от temp в height.
  5. Разменени са: 80 x 120.

В наивния вариант width = height записва 80 в width, а старото 120 изчезва. Когато после height = width, в width вече има 80 и то се копира обратно.

Поправката е трета, помощна променлива temp. Тя пази 120, преди width да бъде презаписана. После 120 отива от temp в height и размерите излизат 80 x 120.

По-точно, за любопитните
В JavaScript размяната може да се напише и на един ред. Отдясно двете стойности се събират в масив и чак после се записват отляво:
let width = 120;
let height = 80;
[width, height] = [height, width];
console.log(width + " x " + height);
Изход
80 x 120

Ще го срещаш в чужд код. Тук пишем с temp, за да се вижда какво става стъпка по стъпка.

Пробвай

Подреди размяната

В магазина двама колеги си разменят смените. morning е „Иван“, а evening е „Мария“. Подреди редовете така, че да се разменят.

  1. morning = evening;
  2. const temp = morning;
  3. console.log("Сутрин: " + morning + ", вечер: " + evening);
  4. evening = temp;

Идеята

Типът е на стойността

В JavaScript не пишеш типа на променливата. Той е на стойността: 3 е number, "три" е string. Затова променлива с let може после да получи стойност от друг тип:

let nights = 3;
console.log(typeof nights);
nights = "три";
console.log(typeof nights);
Изход
number
string

JavaScript не се оплаква. Това се казва динамично типизиране: типът се знае чак докато програмата работи. Удобно е, но и лесно води до грешки. Пази в една променлива един вид стойност.

const пази от друго: стойността не може да се смени изобщо, нито с друг тип, нито със същия:

const nights = 3;
nights = 4;
Съобщение от Node.js
TypeError: Assignment to constant variable.

Затова пиши const, а let само когато стойността наистина се сменя.

По-точно, за любопитните

В стар код ще видиш var вместо let. Той работи малко по-различно и в новия код не се ползва.

Упражнение

Твоите променливи

Реши задачите в редактора си. Стойностите са записани в кода, без четене от клавиатурата. Четенето е в следващия урок.

1. Размяна. На горния рафт има 15 книги, на долния 27. Запиши ги в две променливи, размени стойностите им и отпечатай преди и след.

Изход
Преди: горе 15, долу 27
След: горе 27, долу 15

2. Възраст. Запиши име и възраст в две променливи и ги отпечатай в изречение.

Изход
Мария е на 19 години.

3. Карта на хотел. Запиши в променливи името на хотела (текст), звездите (цяло число), оценката (дробно), дали има закуска (да или не) и категорията (един символ). Отпечатай ги.

Изход
Хотел „Морска звезда“
Звезди: 4
Оценка: 8.7
Закуска: true
Категория: B

Още задачи

  • Три в кръг. Три каси имат съответно 120, 85 и 240 € в началото на деня. Премести сумите в кръг: първата отива във втората, втората в третата, третата в първата. Ползвай една помощна променлива. Отпечатай 240 120 85.
  • Типовете. Отпечатай с typeof типа на всяка стойност от задача 3.
  • Нарочна грешка. Смени стойността на една const по-късно в програмата и прочети какво казва Node.js. После напиши оценката със запетая, const rating = 8,7;.

Тест

Провери се

1. Какво прави редът let count = 5;?
2. Какъв е типът на 12.99 в JavaScript?
3. let a = 5; const b = a; a = 9; Колко е b?
4. Защо размяната на две стойности иска трета променлива?
5. const nights = 3; и после nights = 4;. Какво става?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·