└── readme.md /readme.md: -------------------------------------------------------------------------------- 1 | # Шпаргалка по Javascript 2 | 3 | Здесь собраны часто встречающиеся вопросы на собеседовании по Javascript. 4 | 5 | --- 6 | 7 | ## **База** 8 |
9 | Назови типы данных в Js 10 |
Null, undefined, number, string, bolean, object, bigint, symbol
11 |
12 | 13 |
14 | Чем отличается let var и const 15 |
16 |

Переменная, объявленная через var, видна везде в функции.

17 |

Переменная, объявленная через const или let, видна только в рамках блока {...}, в котором объявлена.

18 |

Объявление const задаёт константу, то есть переменную, которую нельзя менять:

19 |

20 | 21 | ```jsx 22 | const apple = 5; 23 | apple = 10; // ошибка 24 | ``` 25 |

26 |
27 |
28 |
29 | Чем отличается == от === 30 |
31 |

== и === это операторы который проверяют равны ли операнды и возвращает bolean true или false

32 |

== проверяет равны ли операнды даже если они разных типов

33 |

=== строгое равенство которое проверяет равны ли не только операнды но и их типы

34 |
35 |
36 |
37 | Чем отличается setTimeout от setInterval 38 |
39 |

setTimeout позволяет вызвать функцию **один раз** через определённый интервал времени.

40 |

setInterval позволяет вызывать функцию **регулярно**, повторяя вызов через определённый интервал времени.

41 | 42 |
43 |
44 | 45 |
46 | Что такое use strict 47 |
48 |

[use strict](https://learn.javascript.ru/strict-mode) - это установка, которая заставляет код обрабатываться в *строгом режиме*. Без этой установки код обрабатывается в *неограниченном режиме*. Это установку нужно писать в начале файла.

49 |

Строгий режим ограничивает функционал javascript в пользу багоустойчивого кода.

50 |

Например:

51 |

Нельзя присваивать значение в неопределённую переменную

52 |

53 | 54 | ```jsx 55 | (function() { 56 | "use strict"; 57 | x = 5; // ReferenceError: x is not defined 58 | })(); 59 | 60 | x = 5; // Создает глобальную переменную x 61 | ``` 62 | 63 |

64 | 65 |

Нельзя дублировать свойства обьекта

66 | 67 |

68 | 69 | ```jsx 70 | (function() { 71 | "use strict"; 72 | var x = { 73 | a: 1, 74 | a: 2 75 | }; // SyntaxError: Duplicate data property in object literal 76 | })(); // not allowed in strict mode 77 | 78 | var x = { 79 | a: 1, 80 | a: 2 81 | }; // x равно {a: 2} 82 | ``` 83 | 84 |

85 |
86 |
87 | 88 |
89 | Что такое Callback 90 |
91 |

Коллбэк — это функция, которая должна быть выполнена после того, как другая функция завершила выполнение

92 |
93 |
94 | 95 | ## **Объекты** 96 |
97 | Перечисли методы объекта 98 |
99 | 109 |
110 |
111 |
112 | Что такое глубокое и неглубокое копирования 113 |
114 |

При копировании объектов или массивов JavaScript копирует данные только на один уровень вглубь. Этот тип копирования называется поверхностным (shallow). Если необходимо полностью скопировать сложную структуру данных, например, массив с объектами, то нужно делать глубокое (deep) или полное копирование данных.

115 | 116 |

117 | 118 | ```jsx 119 | const itemsInCart = [ 120 | { product: 'Носки', quantity: 3 }, 121 | { product: 'Штаны', quantity: 1 }, 122 | { product: 'Кепка', quantity: 1 }, 123 | ] 124 | 125 | const clonedCart = [...itemsInCart] 126 | ``` 127 | 128 |

129 | 130 |

131 | 132 | ```jsx 133 | const deep = JSON.parse(JSON.stringify(itemsInCart)) 134 | console.log(itemsInCart[1] === deep[1]) 135 | // false 136 | ``` 137 | 138 |

139 | 140 |

У этого метода есть ограничение — копируемые данные должны быть сериализуемы.

141 | 142 |

143 | 144 | Вот примеры несериализуемых данных: примитив undefined, функция, [symbol](https://doka.guide/js/symbol/) - при вызове JSON.stringify получаем undefined 145 | 146 |

147 |

148 | Что бы работать с сериализуемыми данными можно использовать библиотеку *Lodash* или *structuredClone* Источник - https://habr.com/ru/companies/otus/articles/719460/ 149 |

150 | 151 | 152 |
153 |
154 | 155 |
156 | Как удалить значение объекта 157 |
158 | 159 |

С помощью оператора delete

160 | 161 |
162 |
163 | 164 | 165 |
166 | Что такое деструктуризация? 167 |
168 |

[Деструктуризация](https://learn.javascript.ru/destructuring) - это особый синтаксис, позволяющий извлекать значения из объектов

169 |
170 |
171 | 172 |
173 | Деструктуризируй объект 174 |
175 | 176 | ```jsx 177 | const objToDestr = { 178 | name: 'John', 179 | age: 20, 180 | address: { 181 | country: 'Ukraine', 182 | city: 'Kyiv' 183 | }, 184 | } 185 | 186 | let {name, address: {country}} = objToDestr 187 | console.log(name, country) 188 | ``` 189 | 190 |
191 |
192 | 193 |
194 | Что такое new Map 195 |
196 |

[Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) – это коллекция ключ/значение, как и `Object`. Но основное отличие в том, что `Map` позволяет использовать ключи любого типа.

197 |
198 |
199 | 200 |
201 | Что такое weakMap 202 |
203 | weakMap - это тоже самое что и Map только более оптимизированно. 204 |
205 |
206 | 207 |
208 | Расскажи что такое this 209 |
210 | 211 |

Для доступа к информации внутри объекта метод может использовать ключевое слово this

212 |

This — это ключевое слово, используемое в JavaScript, которое имеет особое значение, зависящее от контекста в котором оно применяется

213 | 214 | ```jsx 215 | let user = { 216 | name: "John", 217 | age: 30, 218 | 219 | sayHi() { 220 | // "this" - это "текущий объект". 221 | alert(this.name); 222 | } 223 | 224 | }; 225 | ``` 226 |
227 |
228 | 229 |
230 | Как работают методы apply(), call() и bind() 231 |
232 | 233 | Функции в JavaScript никак не привязаны к своему контексту this, с одной стороны, здорово – это позволяет быть максимально гибкими, одалживать методы и так далее. 234 | 235 | Но с другой стороны – в некоторых случаях контекст может быть потерян. Способы явно указать this - методы bind, call и apply. 236 | 237 | - Синтаксис метода call: func.call(context, arg1, arg2, ...) 238 | 239 | При этом вызывается функция func, первый аргумент call становится её this, а остальные передаются «как есть». Вызов func.call(context, a, b...) – то же, что обычный вызов func(a, b...), но с явно указанным this(=context). 240 | 241 | - Если нам неизвестно, с каким количеством аргументов понадобится вызвать функцию, можно использовать более мощный метод: apply. Вызов функции при помощи func.apply работает аналогично func.call, но принимает массив аргументов вместо списка. 242 | 243 | func.call(context, arg1, arg2) идентичен вызову func.apply(context, [arg1, arg2]); 244 | 245 | - Синтаксис встроенного bind: var wrapper = func.bind(context, [arg1, arg2...]) 246 | 247 | Методы bind и call/apply близки по синтаксису, но есть важнейшее отличие. Методы call/apply вызывают функцию с заданным контекстом и аргументами. А bind не вызывает функцию. Он только возвращает «обёртку», которую мы можем вызвать позже, и которая передаст вызов в исходную функцию, с привязанным контекстом. 248 | 249 | 250 | *Источник: [javascript.ru - call и apply](https://learn.javascript.ru/call-apply#metod-apply) [javascript.ru - bind](https://learn.javascript.ru/bind#bind)* 251 | 252 |
253 |
254 | 255 | ## **Массивы** 256 | 257 |
258 | Какие методы массивов ты знаешь 259 |
260 | Шпаргалка по методам массива: 261 | 262 | - Для добавления/удаления элементов: 263 | - `push (...items)` – добавляет элементы в конец, 264 | - `pop()` – извлекает элемент с конца, 265 | - `shift()` – извлекает элемент с начала, 266 | - `unshift(...items)` – добавляет элементы в начало. 267 | - `splice(pos, deleteCount, ...items)` – начиная с индекса `pos` удаляет `deleteCount` элементов и вставляет `items`. 268 | - `slice(start, end)` – создаёт новый массив, копируя в него элементы с индекса `start` до `end` (не включая `end`). 269 | - `concat(...items)` – возвращает новый массив: копирует все члены текущего массива и добавляет к нему `items`. Если какой-то из `items` является массивом, тогда берутся его элементы. 270 | - Для поиска среди элементов: 271 | - `indexOf/lastIndexOf(item, pos)` – ищет `item`, начиная с позиции `pos`, и возвращает его индекс или `1`, если ничего не найдено. 272 | - `includes(value)` – возвращает `true`, если в массиве имеется элемент `value`, в противном случае `false`. 273 | - `find/filter(func)` – фильтрует элементы через функцию и отдаёт первое/все значения, при прохождении которых через функцию возвращается `true`. 274 | - `findIndex` похож на `find`, но возвращает индекс вместо значения. 275 | - Для перебора элементов: 276 | - `forEach(func)` – вызывает `func` для каждого элемента. Ничего не возвращает. 277 | - Для преобразования массива: 278 | - `map(func)` – создаёт новый массив из результатов вызова `func` для каждого элемента. 279 | - `sort(func)` – сортирует массив «на месте», а потом возвращает его. 280 | - `reverse()` – «на месте» меняет порядок следования элементов на противоположный и возвращает изменённый массив. 281 | - `split/join` – преобразует строку в массив и обратно. 282 | - `reduce/reduceRight(func, initial)` – вычисляет одно значение на основе всего массива, вызывая `func` для каждого элемента и передавая промежуточный результат между вызовами. 283 | - Дополнительно: 284 | - `Array.isArray(arr)` проверяет, является ли `arr` массивом. 285 | 286 |
287 |
288 |
289 | Чем отличается map от forEach 290 |
291 | 292 | 1. map сохраняет значение через return, forEach всегда возвращает undefined 293 | 2. Второе различие между этими методами: map() можно привязывать к другим методам - reduce(), sort(), filter() и т.д. А вот forEach(), как вы можете догадаться, возвращается undefined. 294 | 2. map более производительный 295 | 3. map относится к функциональному программированию, а forEach к процедурному 296 | 297 |
298 |
299 | 300 |
301 | Расскажи про reduce 302 |
303 | 304 | Reduce используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата. 305 | 306 | ```jsx 307 | let arr = [1, 2, 3, 4, 5] 308 | 309 | var result = arr.reduce(function(sum, current) { 310 | return sum + current; 311 | }, 0); 312 | 313 | alert( result ); // 15 314 | 315 | //sum результат добавления двух чисел в начале 316 | //берет значение 2 аргумента или 1 элемента массива 317 | //current текущее значение массива которая в цикле меняеться 1,2,3... 318 | // цикл будет выполняться следующим образом 319 | // 0 + 1 320 | // 1 + 2 321 | // 3 + 3 322 | //... 323 | 324 | ``` 325 | 326 |
327 |
328 | 329 |
330 | Что такое new Set 331 |
332 | 333 | Set – это коллекция как и `Array`. Но основное отличие в том, что в Set каждое значение может появляться только один раз. 334 | 335 |
336 |
337 | 338 |
339 | Что такое weakSet 340 |
341 | 342 | weakSet - это тоже самое что и Set только более оптимизировано. 343 | 344 |
345 |
346 | 347 | ## **Продвинутый** 348 | 349 |
350 | Расскажи про Promise 351 |
352 | 353 | [Promise](https://learn.javascript.ru/promise) — специальный объект JavaScript, который используется для написания и обработки асинхронного кода например запросов с сервера 354 | 355 | Способ использования, в общих чертах, такой: 356 | 357 | 1. Код, которому надо сделать что-то асинхронно, создаёт объект `promise` и возвращает его. 358 | 2. Внешний код, получив `promise`, навешивает на него обработчики. 359 | 3. По завершении процесса асинхронный код переводит `promise` в состояние `fulfilled` (с результатом) или `rejected` (с ошибкой). При этом автоматически вызываются соответствующие обработчики во внешнем коде. 360 | 361 | Синтаксис создания `Promise`: 362 | 363 | ```jsx 364 | let promise = new Promise(function(resolve, reject) { 365 | // Эта функция будет вызвана автоматически 366 | 367 | // В ней можно делать любые асинхронные операции, 368 | // А когда они завершатся — нужно вызвать одно из: 369 | // resolve(результат) при успешном выполнении 370 | // reject(ошибка) при ошибке 371 | }) 372 | ``` 373 | 374 |
375 |
376 | 377 |
378 | Чем отличаются стрелочные функции от обычной функции 379 |
380 | 381 | [Стрелочные функции](https://learn.javascript.ru/arrow-functions): 382 | 383 | - Сокращают написание функции 384 | - Не имеют `this`. 385 | - Не имеют `arguments`. 386 | - Не могут быть вызваны с `new`. 387 | 388 |
389 |
390 | 391 |
392 | Что такое Event Loop и как он устроен 393 |
394 | Event Loop - это бесконечный цикл событий, благодаря которому мы можем реализовать многопоточность в javascript. 395 | 396 |

397 | 398 | Многопоточность - это способность выполнять несколько параллельных задач - потоков 399 | 400 |
401 |
402 | 403 |
404 | Что такое рекурсия? И какое главное правило рекурсии? 405 |
406 | 407 | Рекурсия в javascript это когда функция вызывает саму себя. Главное правило рекурсии это написать выход из нее. 408 | 409 |
410 |
411 | 412 |
413 | Что такое замыкание 414 |
415 | 416 | [Замыкание](https://learn.javascript.ru/closure) – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В некоторых языках это невозможно, или функция должна быть написана специальным образом, чтобы получилось замыкание. Но, как было описано выше, в JavaScript, все функции изначально являются замыканиями 417 | 418 |
419 |
420 | 421 |
422 | Зачем нужны тесты 423 |
424 | 425 | Тесты нужны для: 426 | 427 | 1) Уменьшение количество багов 428 | 429 | 2) Уменьшение времени работы над таской. Чем больше тестов, тем более багоустойчив код. Тем меньше таска переходит от разработчика ⇒ тестировщику ⇒ менеджеру 430 | 431 | 3) хорошие тесты - это еще и документация, и они помогают быстрее адаптироваться новым членам команды 432 | 433 |
434 |
435 | 436 |
437 | Что такое TDD 438 |
439 | 440 | TDD - это аббревиату́ра которая означает Test-driven development. 441 | 442 | TDD - разработка на основе тестов. 443 | 444 |
445 |
446 | 447 |
448 | Что такое BABEl 449 |
450 | 451 | Babel - это транспайлер, который переписывает код современного стандарта Javascript (ES2015) на более поздний. Благодаря этому мы можем поддерживать браузеры которые не поддерживают новый функционал JS 452 | 453 |
454 |
455 | 456 |
457 | Расскажи что такое ООП и методы этой парадигмы 458 |
459 | 460 | Объектно-ориентированное программирование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. 461 | 462 | **Абстрагирование** — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения не значимые  Соответственно, абстракция — это набор всех таких характеристик. 463 | 464 | **Инкапсуляция** — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя. 465 | 466 | **Наследование** — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом 467 | 468 | **Полиморфизм** — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. 469 | 470 | [Источник](https://devcolibri.com/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BE%D0%BE%D0%BF-%D0%B8-%D1%81-%D1%87%D0%B5%D0%BC-%D0%B5%D0%B3%D0%BE-%D0%B5%D0%B4%D1%8F%D1%82/) 471 | 472 |
473 |
474 | 475 |
476 | Чем отличается Функционально программирование от ООП 477 |
478 | 479 | В объектно-ориентированном программировании (ООП) вы создаете «объекты» (отсюда и название), которые представляют собой структуры, содержащие данные и методы. В функциональном программировании все является функцией. Функциональное программирование пытается разделить данные и поведение, а ООП объединяет эти концепции. 480 | 481 |
482 |
483 | 484 |
485 | Что такое WebSocket 486 |
487 | 488 | WebSocket – это современный способ иметь постоянное соединение между браузером и сервером.
489 | Преимущества
490 | - Нет ограничений, связанных с кросс-доменными запросами.
491 | - Имеют хорошую поддержку браузерами.
492 | - Могут отправлять/получать как строки, так и бинарные данные.
493 | 494 |
495 |
496 | 497 | ### Другое 498 | 499 |
500 | 0.1 + 0.2 в javascript что будет 501 |
502 | 503 | Внутри JavaScript число представлено в виде 64-битного формата [IEEE-754](https://ru.wikipedia.org/wiki/IEEE_754-1985). Для хранения числа используется 64 бита: 52 из них используется для хранения цифр, 11 для хранения положения десятичной точки и один бит отведён на хранение знака. 504 | 505 | Если число слишком большое, оно переполнит 64-битное хранилище, JavaScript вернёт бесконечность: 506 | 507 | `alert( 1e500 ); // Infinity` 508 | 509 | [Так что если 52 бит не хватает на цифры, то при записи происходит такой баг](https://learn.javascript.ru/number#:~:text=%D0%92%20JavaScript%20%D0%BD%D0%B5%D1%82%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%B4%D0%BB%D1%8F,%D1%82%D1%80%D0%B5%D1%82%D1%8C%D1%8E%20%D0%B2%20%D0%B4%D0%B5%D1%81%D1%8F%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5%20%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F.) 510 | 511 | Для точных вычислений использую библиотеку [decimal.js](https://github.com/MikeMcl/decimal.js#readme) 512 | 513 |
514 |
515 | 516 |
517 | Операции с разными типами в например true + true = ? 518 |
519 | 520 | ```jsx 521 | null + undefined = Nan 522 | null + {} = 'null[object Object]' 523 | null + [] = 'null' 524 | null + true = 1 525 | null - true = -1 526 | null + false = 0 527 | null - false = 0 528 | null + '' = 'null' 529 | 530 | true + true = 2 531 | true - true = 0 532 | true + false = 1 533 | true - false = 1 534 | true + undefined = Nan 535 | true + [] = 'true' 536 | true + {} = 'true[object Object]' 537 | true + '' = 'true' 538 | 539 | false - false = 0 540 | false + false = 0 541 | false + undefined = NaN 542 | false + [] = 'false' 543 | false + {} = 'false[object Object]' 544 | false + '' = 'false' 545 | ``` 546 |
547 |
548 | 549 |
550 | obj[0] + obj[’0’] 551 |
552 | 553 | ```jsx 554 | let obj = { 555 | ”0”: 1, 556 | 0: 2 557 | } 558 | obj[’0’] // 2 559 | obj[0] // 2 560 | 561 | console.log(obj[0] + obj[’0’]) //Будет ровно 4 562 | ``` 563 | 564 |
565 |
566 | 567 |
568 | Расскажи про requestAnimationFrame 569 |
570 | requestAnimationFrame - это метод браузерного API, который используется для анимации веб-страницы. Основное преимущество этого метода в том, что он автоматически регулирует частоту кадров анимации, что позволяет получить более плавную анимацию и снизить нагрузку на процессор и потребление ресурсов. 571 |
572 |
573 | --------------------------------------------------------------------------------