Нагадайки-поясняйки

Escape characters

\n — перенос рядка

console.log("1\n2\n3\n4");

\tтабуляціяarrow-up-right (горизонтальна)

console.log("1\t2\t3\t4");

\ — екранування наступного символа. Екранований символ просто відображається як текст, а не використаний як спеціальна штука з мови програмування. Наприклад:

console.log("ці лапки \"заекрановані\", тому все відобразиться");
console.log("ці лапки не "заекрановані", тому буде помилка");

/*
Помилка буде, бо без екрану це перетворюється на 2 окремих рядка 
    "ці лапки не "
та
    ", тому буде помилка"
а між ними - якась незрозуміла для комп'ютера фігня, яка все ламає
*/

Увага: \n, \t та інші escape charactersarrow-up-right треба екранувати разом із їх бекслешем:

console.log("Перенос рядка")
console.log("екранований: a1\\nb");
console.log("не екранований: a\nb");
console.log("\nТабуляція")
console.log("екранована: a\\tb");
console.log("не екранована: b\tb");
// і т.д. і т.п.

Не лякайтесь посилання: крім \n, \t та екранованих лапок вам на Zero інші escapes не знадобляться :)

p.s. Конкретно лапки можна вставляти в рядки й без екрану, якщо вони різних типів:

Про =, == та ===

Літерали

Літерал — це "голе" значення. Умовно кажучи: те, що можна покласти до змінної. Наприклад:

У цьому прикладі літерали — це:

  • "222"

  • 100500

  • ", "

  • 12345

  • true

Скорочення

Числа

Штуки типу i = i + 2 або i = i + "*"варто скорочувати через +=.

Довго
Коротко

i = i + 123

i += 123

i = i + "*"

i += "*"

i = i + ":)"

i += ":)"

i = i + "\n"

i += "\n"

i = i - 15

i -= 15

i = i * -3

i *= -3

i = i / 7.98

i /= 7.98

Це працює і зі змінними, і з літералами. Звісно, змінна може називатись не лише i

Якщо треба додати / відняти саме одиницю, є ще коротші форми: інкремент та декремент.

Дуже довго
Довго
Гарнюня

i = i + 1

i += 1

i++

i = i - 1

i -= 1

i--

Увага: = в інкременті не треба. Треба просто i++ або i--: як є, без нічого. Умовно кажучи, у цих спецсимволах = вже "вшитий під капотом".

Запис типу i = i++ або i = i-- працюватиме, але це неправильно і нівелює саму суть скорочення запису.

Запустіть код та читайте консоль

boolean

! — логічне заперечення, логічне "не".

Тернарний оператор

Тернарний оператор — це коротка (та з парою особливих фіч) заміна if else для випадків, коли є лише 2 можливих варіанти розгалуження, а кожна дія може бути записана одним рядком коду.

У звичайного if else структура така:

А тернарним оператором те ж саме записується так:

Тобто, наприклад

З тернарником скорочується до

А якщо звернути увагу, що в обох варіантах початок та кінець повторюються, можна ще коротше:

Тут слід пам'ятати, що тернарник, на відміну від if else — це окрема незалежна сутність (як масив, наприклад). І тому, якщо треба результат передати до функції, не треба викликати її саму в тернарнику двічі поспіль. Можна сам тернарник передати, як аргумент 😉

Тобто, краще не писати так:

А замість того писати так:

Вкладені тернарники

Як if else можуть вкладатись одне в одного, так і тернарники можуть бути вкладеними в інші тернарники.

Кількість рівнів вкладеності необмежена.

У цій кракозябрі легко заплутатись, але тернарник у більшості випадків нормально розуміє перенос рядків, тому можна записати якось так:

Це теж далеко не зразок читабельності. Але вже набагато більше схоже на знайомі if else. Та одночасно непогано демонструє вкладені один у одного тернарники.

Проте, якщо доводиться щось таке писати, то тернарник майже 100% буде не найкращим рішенням. Тому що він про скорочення, а тут не дуже й коротко; ну а без переносів це не дуже читабельно.

Тож дійте за обставинами, керуйтесь здоровим глуздом і не туліть всюди тернарники замість if else без необхідності, а просто тому, що це якась прикольна штука 😉

Остача від ділення націло (%)

Якщо ви гуглили, що воно таке, то, скоріш за все, натикались на статтю з Вікіпедіїarrow-up-right. Якщо зрозуміли - круто. Але якщо той математичний канцелярит не зайшов, є простіше пояснення.

Є a % b . Беремо найбільше число, кратне b, яке менше або дорівнює a . Віднімаємо від a це число. Отримана різниця - і є результат. На прикладі 10 % 3: найближче до 10, яке можна націло розділити на 3 (тобто кратне 3) - це 9. 10 - 9 = 1. Тобто10 % 3 буде 1.

Ось демо-код. Повводьте туди різні числа, в т.ч. від'ємні та не цілі (6.21 і т.п.). І дивіться, що буде.

Яке у цього практичне застосування? Та дуже просте. Якщо остача a % b === 0, то a ділиться без остачі на b. Тобто a кратне b. Так, наприклад, можна перевірити число на парність/непарність, визначивши, чи кратне воно двійці. Або можна дізнатись, скільки мінімум автобусів потрібно для перевозки групи a туристів, якщо в кожному автобусі - максимум b місць. Або ще щось таке, придумайте самі :)

Складання у змінну

Інколи (навіть часто), коли в циклах щось виводимо на консоль, замість 100500 разів просто виводити щось на кожній ітерації, корисніше та зручніше — складати значення до змінної (додавати до неї, конкатенувати з нею) а потім один раз виводити саме цю змінну.

Тобто замість

якось типу так

Приведення типів

Найчастіші процедури на Zero

Таблиця конвертацій

Табличка звідсиarrow-up-right

Значення

Перетворене на число

Перетворене на рядок

Перетворене на boolean

false

0

"false"

false

true

1

"true"

true

0

0

"0"

false

1

1

"1"

true

"0"

0

"0"

true

"000"

0

"000"

true

"1"

1

"1"

true

"20"

20

"20"

true

""

0

""

false

"twenty"

NaN

"twenty"

true

NaN

NaN

"NaN"

false

Infinity

Infinity

"Infinity"

true

-Infinity

-Infinity

"-Infinity"

true

null

0

"null"

false

undefined

NaN

"undefined"

false

[ ]

0

""

true

[20]

20

"20"

true

[10,20]

NaN

"10,20"

true

Скоуп

Скоуп (область видимості) — це шматок кода всередині{ }

Цикли 2, 3 та 4 входять до скоупу 1. 3 входить до скоупів 1 та 2. 4 входить до скоупу 1.

І є ще глобальний скоуп, куди входять вони всі разом. Це "нульовий" рівень, тобто ВЕСЬ код в редакторі. Можете уявити, що весь код в IDE загорнутий у верховні невидимі { }.

Змінні зі внутрішнього скоупу "бачать" зовнішні. Але із зовнішнього скоупу не видно внутрішні.

Тобто правило просте: назовні — бачимо, всередину — ні.

Цикли

Тіло цикла — все, що знаходиться всередині цикла { тут }

Структура циклів

  • Якщо треба повторити дії конкретну кількість разів, то юзаємо for.

  • Якщо вказати кількість повторів заздалегідь неможливо: while.

  • Якщо треба зробити щось незалежно від обставин як мінімум 1 раз, а далі — по ситуації: do while

for

1: місце для створення однієї або кількох змінних (якщо кілька — через кому)

2: вираз або змінна, який цикл конвертує в boolean (див. табличку вище). Доки 2 буде true, цикл повторюватиметься. Якщо стане false — цикл перерветься.

3: дії, які виконаються в кінці кожної ітерації

У цьому прикладі:

1: let i = 0, j = 10, k = true 2: i < 25 3: i++, j--, k = !k

Увага: 1, 2 та 3 входять в скоуп цикла, в якому вони створені.

while

Те саме, що for, але має лише блок 2. 1 Треба руками записувати перед циклом десь ззовні, а 3 — в тілі циклу (дляповної тотожності — в самому кінці перед }.

do while

Що б там не було, бодай 1 раз виконати все, що в X. Потім перевірити, чи Y == true. Якщо так — повторювати X доти, доки Y == true

continue та break

continue: "ігнорувати весь код в наступних рядках та перейти до наступної ітерації цикла"

break: "завершити цикл" (точно так же, як якщо б в блоку 2 стало false)

Увага: continue та break впливають лише на свій скоуп і не чіпають зовнішній. Умовно:

Брейкати зовнішні скоупи можливоarrow-up-right, але це не знадобиться на Zero.

А взагалі варто уникати continue та break. В тому сенсі, що, якщо можливо без них — робіть без них. Вони не про "коли завершити" а "якщо щось трапилось — завершити".

Повну різницю між ними зрозумієте на курсі P2P CS.

Ну типу, навіщо робити якось так:

коли сама структура циклів підштовхує робити так:

break / continue доречні, коли треба зреагувати на щось, що виникає внаслідок роботи самого циклу. Наприклад:

Коротше кажучи, у більшості випадків, якщо цикл переривається через break, а не через умову переривання в голові цикла — з алгоритмом щось не так, і його варто оптимізувати.

Last updated

Was this helpful?