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

Escape characters

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

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

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

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

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

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

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

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

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 без необхідності, а просто тому, що це якась прикольна штука 😉

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

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

Є 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

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

Табличка звідси

Значення

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

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

Перетворене на 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 впливають лише на свій скоуп і не чіпають зовнішній. Умовно:

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

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

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

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

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

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

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

Last updated

Was this helpful?