Променливи и типове
Проблем
Цената е на три места
В онлайн магазина една цена се появява на няколко места: в каталога, в количката и при плащането. Ако е написана навсякъде с числа, ето какво става:
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 бр.Намаление: truenumber: всяко число, цяло или дробно: брой, цена, тегло. В кода десетичният знак е точка: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);stringnumbernumberbooleanstringПо-точно, за любопитните
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.5900719925474099190071992547409929007199254740993nnumber пази числата в двоична система и някои дробни стойности като 0.1 не стават точно: 0.1 + 0.2 е 0.30000000000000004. Затова истинските програми пазят парите в цели стотинки (центове). В курса за кратко пишем цените като number.
Пробвай
Намери грешката
Програмата трябва да отпечата една покупка. Тя не тръгва: Node.js казва SyntaxError. На кой ред е грешката?
Избери реда с грешката.
SyntaxError: Unexpected number, и програмата не тръгва. Цената е const price = 2.40;.Идеята
= записва копие
Знакът = не е „равно“ като в математиката. Той значи: вземи стойността отдясно и я запиши в променливата отляво. Това се казва присвояване. Старата стойност на променливата изчезва.
Когато отдясно е друга променлива, записва се копие на стойността ѝ в този момент. Двете променливи не остават свързани:
let seats = 40;const seatsAtStart = seats;seats = 37;console.log("В началото: " + seatsAtStart);console.log("Сега: " + seats);В началото: 40Сега: 37seatsAtStart получава 40. После seats става 37, но копието в seatsAtStart си остава 40.
seats е с let, защото стойността ѝ се сменя. seatsAtStart е с const: тя само помни началото.
Пробвай
Коя стойност остава?
Какво ще отпечата програмата?
let roomA = 12;let roomB = 20;roomA = roomB;roomB = 25;console.log(roomA + " и " + roomB);roomA = roomB записва в roomA копие на 20. Когато после roomB става 25, roomA не се променя.
Проблем
Размерите са разменени
Програма за печат на снимки получава размерите разменени: ширина 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Стъпка по стъпка, с думи
- Ширината и височината са въведени разменени: 120 и 80.
- temp = width: копие на 120 отива в temp. В width си остава 120.
- width = height: копие на 80 влиза в width. Старото 120 оттам изчезва, но е запазено в temp.
- height = temp: 120 се връща от temp в height.
- Разменени са: 80 x 120.
В наивния вариант width = height записва 80 в width, а старото 120 изчезва. Когато после height = width, в width вече има 80 и то се копира обратно.
Поправката е трета, помощна променлива temp. Тя пази 120, преди width да бъде презаписана. После 120 отива от temp в height и размерите излизат 80 x 120.
По-точно, за любопитните
let width = 120;let height = 80;[width, height] = [height, width];console.log(width + " x " + height);80 x 120Ще го срещаш в чужд код. Тук пишем с temp, за да се вижда какво става стъпка по стъпка.
Пробвай
Подреди размяната
В магазина двама колеги си разменят смените. morning е „Иван“, а evening е „Мария“. Подреди редовете така, че да се разменят.
morning = evening;const temp = morning;console.log("Сутрин: " + morning + ", вечер: " + evening);evening = temp;
Идеята
Типът е на стойността
В JavaScript не пишеш типа на променливата. Той е на стойността: 3 е number, "три" е string. Затова променлива с let може после да получи стойност от друг тип:
let nights = 3;console.log(typeof nights);nights = "три";console.log(typeof nights);numberstringJavaScript не се оплаква. Това се казва динамично типизиране: типът се знае чак докато програмата работи. Удобно е, но и лесно води до грешки. Пази в една променлива един вид стойност.
const пази от друго: стойността не може да се смени изобщо, нито с друг тип, нито със същия:
const nights = 3;nights = 4;TypeError: Assignment to constant variable.Затова пиши const, а let само когато стойността наистина се сменя.
По-точно, за любопитните
В стар код ще видиш var вместо let. Той работи малко по-различно и в новия код не се ползва.
Упражнение
Твоите променливи
Реши задачите в редактора си. Стойностите са записани в кода, без четене от клавиатурата. Четенето е в следващия урок.
1. Размяна. На горния рафт има 15 книги, на долния 27. Запиши ги в две променливи, размени стойностите им и отпечатай преди и след.
Преди: горе 15, долу 27След: горе 27, долу 152. Възраст. Запиши име и възраст в две променливи и ги отпечатай в изречение.
Мария е на 19 години.3. Карта на хотел. Запиши в променливи името на хотела (текст), звездите (цяло число), оценката (дробно), дали има закуска (да или не) и категорията (един символ). Отпечатай ги.
Хотел „Морска звезда“Звезди: 4Оценка: 8.7Закуска: trueКатегория: BОще задачи
- Три в кръг. Три каси имат съответно 120, 85 и 240 € в началото на деня. Премести сумите в кръг: първата отива във втората, втората в третата, третата в първата. Ползвай една помощна променлива. Отпечатай 240 120 85.
- Типовете. Отпечатай с
typeofтипа на всяка стойност от задача 3. - Нарочна грешка. Смени стойността на една
constпо-късно в програмата и прочети какво казва Node.js. После напиши оценката със запетая,const rating = 8,7;.
Тест