├── README.md └── donate-qr.png /README.md: -------------------------------------------------------------------------------- 1 | ## Вопросы на собеседовании фронтенд разработчика React.js 2 | 3 |

Здесь собраны самые популярные вопросы, задаваемые на русскоязычных собеседованиях front-end разработчиков на React.js. Тематика вопросов включает в себя как основы JavaScript и веб-технологий так и глубокое понимание работы React.js и смежных технологий (Redux, MobX и прочего).

4 | 5 | 👇 Поддержать автора чеканной монетой (только для банков РФ). Спасибо! 6 | 7 | 8 | 9 | **JavaScript**: 10 | 11 |
12 | Какие типы данных существуют в JavaScript? 13 |
14 | 40 |

Источник: learn.javascript.ru

41 |
42 |
43 | 44 |
45 | Что такое цикл событий (event loop) и как он работает? 46 |
47 |

Движок браузера выполняет JavaScript в одном потоке. Для потока выделяется область памяти — стэк, где хранятся фреймы (аргументы, локальные переменные) вызываемых функций.

48 |

Список событий, подлежащих обработке формируют очередь событий. Когда стек освобождается, движок может обрабатывать событие из очереди. Координирование этого процесса и происходит в event loop.

49 |

Это по сути бесконечный цикл, в котором выполняются многочисленные обработчики событий. Если очередь пустая — движок браузера ждет, когда поступит событие. Если непустая — первое в ней событие извлекается и его обработчик начинает выполняться. И так до бесконечности.

50 | EventLoop 51 |

Источник: Pavel Bely, medium.com

52 |
53 |
54 | 55 |
56 | Что такое замыкание? 57 |
58 |

Замыкание — это комбинация функции и лексического окружения, в котором эта функция была объявлена. Это окружение состоит из произвольного количества локальных переменных, которые были в области действия функции во время создания замыкания.

59 |

Источник: developer.mozilla.org

60 |
61 |
62 | 63 |
64 | Что такое прототип объекта в JavaScript? 65 |
66 |

Объекты в JavaScript можно организовать в цепочки так, чтобы свойство, не найденное в одном объекте, автоматически искалось бы в другом. Связующим звеном выступает специальное свойство __proto__

67 |

Если один объект имеет специальную ссылку __proto__ на другой объект, то при чтении свойства из него, если свойство отсутствует в самом объекте, оно ищется в объекте __proto__. Недостаток этого подхода – он не работает в IE10-.

68 |

К счастью, в JavaScript с древнейших времён существует альтернативный, встроенный в язык и полностью кросс-браузерный способ. Чтобы новым объектам автоматически ставить прототип, конструктору ставится свойство prototype.

69 |

При создании объекта через new, в его прототип __proto__ записывается ссылка из prototype функции-конструктора.

70 |

Значением Person.prototype по умолчанию является объект с единственным свойством constructor, содержащим ссылку на Person.

71 |

Источник: learn.javascript.ru

72 |
73 |
74 | 75 |
76 | Как работает ключевое слово this? 77 |
78 |

В глобальном контексте выполнения (за пределами каких-либо функций), this ссылается на глобальный объект вне зависимости от использования в строгом или нестрогом режиме.

79 |

В пределах функции значение this зависит от того, каким образом вызвана функция:

80 | 85 |

Источник: developer.mozilla.org

86 |
87 |
88 | 89 |
90 | Как работают методы apply(), call() и bind()? 91 |
92 |

Функции в JavaScript никак не привязаны к своему контексту this, с одной стороны, здорово – это позволяет быть максимально гибкими, одалживать методы и так далее.

93 |

Но с другой стороны – в некоторых случаях контекст может быть потерян. Способы явно указать this - методы bind, call и apply.

94 | 110 |

111 | Источник: 112 |
113 | javascript.ru - call и apply 114 |
115 | javascript.ru - bind 116 |
117 |

118 |
119 |
120 | 121 |
122 | Что такое Promise (Промис)? 123 |
124 |
125 |

Promise – это специальный объект, который содержит своё состояние. Вначале pending («ожидание»), затем – одно из: fulfilled («выполнено успешно») или rejected («выполнено с ошибкой»).

126 |

127 | Синтаксис создания Promise: 128 | 129 | var promise = new Promise(function(resolve, reject) { 130 | // Эта функция будет вызвана автоматически 131 | 132 | // В ней можно делать любые асинхронные операции, 133 | // А когда они завершатся — нужно вызвать одно из: 134 | // resolve(результат) при успешном выполнении 135 | // reject(ошибка) при ошибке 136 | }) 137 |

138 |

139 | Универсальный метод для навешивания обработчиков: 140 | 141 | promise.then(onFulfilled, onRejected) 142 | 143 |

147 | Для того, чтобы поставить обработчик только на ошибку, вместо .then(null, onRejected) можно написать .catch(onRejected) – это то же самое. 148 |

149 | Возьмём setTimeout в качестве асинхронной операции, которая должна через некоторое время успешно завершиться с результатом «result»: 150 | 151 | // Создаётся объект promise 152 | let promise = new Promise((resolve, reject) => { 153 | 154 | setTimeout(() => { 155 | // переведёт промис в состояние fulfilled с результатом "result" 156 | resolve("result"); 157 | }, 1000); 158 | 159 | }); 160 | 161 | // promise.then навешивает обработчики на успешный результат или ошибку 162 | promise 163 | .then( 164 | result => { 165 | // первая функция-обработчик - запустится при вызове resolve 166 | alert("Fulfilled: " + result); // result - аргумент resolve 167 | }, 168 | error => { 169 | // вторая функция - запустится при вызове reject 170 | alert("Rejected: " + error); // error - аргумент reject 171 | } 172 | ); 173 | В результате запуска кода выше – через 1 секунду выведется «Fulfilled: result». 174 |

175 |

Источник: javascript.ru

176 |
177 |
178 | 179 |
180 | Что такое статический метод класса (static)? 181 |
182 |

183 | Ключевое слово static используется в классах для определения статичных методов. Статичные методы функции, принадлежащие объекту класса, но не доступные другим объектам того же класса. 184 | 185 | class Repo { 186 | static getName() { 187 | return "Repo name is modern-js-cheatsheet" 188 | } 189 | } 190 | 191 | // нам не нужно создавать объект класса Repo 192 | console.log(Repo.getName()) // "Repo name is modern-js-cheatsheet" 193 | 194 | let r = new Repo(); 195 | console.log(r.getName()) // необработанная ошибка TypeError: r.getName не является функцией 196 |

197 |

198 | Cтатические методы вызываются через имя класса. Вызывать статические методы через имя объекта запрещено. Статические методы часто используются для создания вспомогательных функций приложения. 199 |

200 |

201 |

202 |

203 | Источник: tproger.ru 204 | 205 |

206 |
207 |
208 | 209 |
210 | Что такое Set, Map, WeakSet и WeakMap? 211 |
212 |
213 |

В ES-2015 появились новые типы коллекций в JavaScript: Set, Map, WeakSet и WeakMap.

214 |

Map – коллекция для хранения записей вида ключ:значение. В отличие от объектов, в которых ключами могут быть только строки, в Map ключом может быть произвольное значение, например:

215 |

216 | 217 | 'use strict'; 218 | 219 | let map = new Map(); 220 | 221 | map.set('1', 'str1'); // ключ-строка 222 | map.set(1, 'num1'); // число 223 | map.set(true, 'bool1'); // булевое значение 224 | 225 | // в обычном объекте это было бы одно и то же, 226 | // map сохраняет тип ключа 227 | alert( map.get(1) ); // 'num1' 228 | alert( map.get('1') ); // 'str1' 229 | 230 | alert( map.size ); // 3 231 |

232 |

233 | Set – коллекция для хранения множества значений, причём каждое значение может встречаться лишь один раз. Например, к нам приходят посетители, и мы хотели бы сохранять всех, кто пришёл. При этом повторные визиты не должны приводить к дубликатам, то есть каждого посетителя нужно «посчитать» ровно один раз. Set для этого отлично подходит: 234 |

235 |

236 | 237 | 'use strict'; 238 | 239 | let set = new Set(); 240 | 241 | let vasya = {name: "Вася"}; 242 | let petya = {name: "Петя"}; 243 | let dasha = {name: "Даша"}; 244 | 245 | // посещения, некоторые пользователи заходят много раз 246 | set.add(vasya); 247 | set.add(petya); 248 | set.add(dasha); 249 | set.add(vasya); 250 | set.add(petya); 251 | 252 | // set сохраняет только уникальные значения 253 | alert( set.size ); // 3 254 | 255 | set.forEach( user => alert(user.name ) ); // Вася, Петя, Даша 256 |

257 |

258 | WeakSet – особый вид Set, не препятствующий сборщику мусора удалять свои элементы. 259 | То же самое – WeakMap для Map. То есть, если некий объект присутствует только в WeakSet/WeakMap – он удаляется из памяти. Это нужно для тех ситуаций, когда основное место для хранения и использования объектов находится где-то в другом месте кода, а здесь мы хотим хранить для них «вспомогательные» данные, существующие лишь пока жив объект. Например, у нас есть элементы на странице или, к примеру, пользователи, и мы хотим хранить для них вспомогательную информацию, например обработчики событий или просто данные, но действительные лишь пока объект, к которому они относятся, существует. Если поместить такие данные в WeakMap, а объект сделать ключом, то они будут автоматически удалены из памяти, когда удалится элемент. Например: 260 |

261 |

262 | 263 | // текущие активные пользователи 264 | let activeUsers = [ 265 | {name: "Вася"}, 266 | {name: "Петя"}, 267 | {name: "Маша"} 268 | ]; 269 | 270 | // вспомогательная информация о них, 271 | // которая напрямую не входит в объект юзера, 272 | // и потому хранится отдельно 273 | let weakMap = new WeakMap(); 274 | 275 | weakMap.set(activeUsers[0], 1); 276 | weakMap.set(activeUsers[1], 2); 277 | weakMap.set(activeUsers[2], 3); 278 | weakMap.set('Katya', 4); //Будет ошибка TypeError: "Katya" is not a non-null object 279 | 280 | alert( weakMap.get(activeUsers[0]) ); // 1 281 | 282 | activeUsers.splice(0, 1); // Вася более не активный пользователь 283 | 284 | // weakMap теперь содержит только 2 элемента 285 | 286 | activeUsers.splice(0, 1); // Петя более не активный пользователь 287 | 288 | // weakMap теперь содержит только 1 элемент 289 |

290 |

Источник: javascript.ru

291 |
292 |
293 | 294 |
295 | 296 | **React**: 297 | 298 |
299 | Какие методы жизненного цикла компонента существуют в React? 300 |
301 | 352 | about React 353 |

Источник: ru.reactjs.org

354 |
355 |
356 | 357 |
358 | Что такое Context в React и для чего он используется? 359 |
360 |
361 |

Контекст разработан для передачи данных, которые можно назвать «глобальными» для всего дерева React-компонентов (например, текущий аутентифицированный пользователь, UI-тема или выбранный язык).

362 |

Контекст позволяет избежать передачи пропсов в промежуточные компоненты: 363 | 364 | // Контекст позволяет передавать значение глубоко 365 | // в дерево компонентов без явной передачи пропсов 366 | // на каждом уровне. Создадим контекст для текущей 367 | // UI-темы (со значением "light" по умолчанию). 368 | const ThemeContext = React.createContext('light'); 369 | 370 | class App extends React.Component { 371 | render() { 372 | // Компонент Provider используется для передачи текущей 373 | // UI-темы вниз по дереву. Любой компонент может использовать 374 | // этот контекст и не важно, как глубоко он находится. 375 | // В этом примере мы передаём "dark" в качестве значения контекста. 376 | return ( 377 | 378 | 379 | 380 | ); 381 | } 382 | } 383 | 384 | // Компонент, который находится в середине, 385 | // теперь не должен явно передавать UI-тему вниз. 386 | function Toolbar(props) { 387 | return ( 388 |

389 | 390 |
391 | ); 392 | } 393 | 394 | class ThemedButton extends React.Component { 395 | // Определяем contextType, чтобы получить значение контекста. 396 | // React найдёт (выше по дереву) ближайший Provider-компонент, 397 | // предоставляющий этот контекст, и использует его значение. 398 | // В этом примере значение UI-темы будет "dark". 399 | static contextType = ThemeContext; 400 | render() { 401 | return
423 |
424 | 425 |
426 | Что такое Виртуальная DOM? 427 |
428 |
429 |

430 | Виртуальный DOM (VDOM) — это концепция программирования, в которой идеальное или «виртуальное» представление пользовательского интерфейса хранится в памяти и синхронизируется с «настоящим» DOM при помощи библиотеки, такой как ReactDOM. Этот процесс называется согласованием. 431 |

432 |

433 | Поскольку «виртуальный DOM» — это скорее паттерн, чем конкретная технология, этим термином иногда обозначают разные понятия. В мире React «виртуальный DOM» обычно ассоциируется с React-элементами , поскольку они являются объектами, представляющими пользовательский интерфейс. Тем не менее, React также использует внутренние объекты, называемые «волокнами» (fibers), чтобы хранить дополнительную информацию о дереве компонентов. Их также можно считать частью реализации «виртуального DOM» в React. 434 |

435 |

Источник: ru.reactjs.org

436 |
437 |
438 | 439 |
440 | Для чего нужен атрибут key при рендере списков? 441 |
442 |
443 |

444 | Ключи (keys) помогают React определять, какие элементы были изменены, добавлены или удалены. Их необходимо указывать, чтобы React мог сопоставлять элементы массива с течением времени. 445 |

446 |

447 | Лучший способ выбрать ключ — это использовать строку, которая будет явно отличать элемент списка от его соседей. Чаще всего вы будете использовать ID из ваших данных как ключи. Когда у вас нет заданных ID для списка, то в крайнем случае можно использовать индекс элемента как ключ. 448 |

449 |

Источник: ru.reactjs.org

450 |
451 |
452 | 453 |
454 | Как работает проп children? 455 |

456 |
457 |

458 | Некоторые компоненты не знают своих потомков заранее. Это особенно характерно для таких компонентов, как Sidebar или Dialog, которые представляют из себя как бы «коробку», в которую можно что-то положить. Для таких компонентов мы рекомендуем использовать специальный проп children, который передаст дочерние элементы сразу на вывод: 459 | 460 | function FancyBorder(props) { 461 | return ( 462 |

463 | {props.children} 464 |
465 | ); 466 | } 467 |

468 |

469 | Это позволит передать компоненту произвольные дочерние элементы, вложив их в JSX: 470 | 471 | function WelcomeDialog() { 472 | return ( 473 | 474 |

475 | Добро пожаловать 476 |

477 |

478 | Спасибо, что посетили наш космический корабль! 479 |

480 | 481 | ); 482 | } 483 |

484 |

485 | Всё, что находится внутри JSX-тега , передаётся в компонент FancyBorder через проп children. Поскольку FancyBorder рендерит {props.children} внутри div, все переданные элементы отображаются в конечном выводе. 486 | 487 |

488 |

Источник: ru.reactjs.org

489 |
490 | 491 | 492 |
493 | В чем разница между управляемыми (controlled) и не управляемыми (uncontrolled) компонентами? 494 |
495 |
496 |

В HTML элементы формы, такие как input, textarea и select, обычно сами управляют своим состоянием и обновляют его когда пользователь вводит данные. В React мутабельное состояние обычно содержится в свойстве компонентов state и обновляется только через вызов setState(). 497 |

498 |

499 | В управляемом компоненте с каждой мутацией состояния связана функция-обработчик. Благодаря этому валидация или изменение введённого значения становится простой задачей. Например, если мы хотим, чтобы имя обязательно было набрано заглавными буквами, можно написать такой handleChange: 500 | 501 | handleChange(event) { 502 | this.setState({value: event.target.value.toUpperCase()}); 503 | } 504 |

505 |

506 | Вместо того, чтобы писать обработчик события для каждого обновления состояния, вы можете использовать неуправляемый компонент и читать значения из DOM через реф. 507 | 508 | class NameForm extends React.Component { 509 | constructor(props) { 510 | super(props); 511 | this.handleSubmit = this.handleSubmit.bind(this); 512 | this.input = React.createRef(); 513 | } 514 | 515 | handleSubmit(event) { 516 | alert('Отправленное имя: ' + this.input.current.value); 517 | event.preventDefault(); 518 | } 519 | 520 | render() { 521 | return ( 522 |

523 | 527 | 528 |
529 | ); 530 | } 531 | } 532 |

533 |

534 | Неуправляемые компоненты опираются на DOM в качестве источника данных и могут быть удобны при интеграции React с кодом, не связанным с React. Количество кода может уменьшиться, правда, за счёт потери в его чистоте. Поэтому в обычных ситуациях мы рекомендуем использовать управляемые компоненты. 535 |

536 |

Источник: ru.reactjs.org

537 |
538 |
539 | 540 |
541 | Что такое PureComponent? 542 |
543 |
544 |

545 | React.PureComponent похож на React.Component. Отличие заключается в том, что React.Component не реализует shouldComponentUpdate(), а React.PureComponent реализует его поверхностным сравнением пропсов и состояния. 546 |

547 |

548 | Если метод render() вашего React-компонента всегда рендерит одинаковый результат при одних и тех же пропсах и состояниях, для повышения производительности в некоторых случаях вы можете использовать React.PureComponent. 549 |

550 |

551 | Метод shouldComponentUpdate() базового класса React.PureComponent делает только поверхностное сравнение объектов. Если они содержат сложные структуры данных, это может привести к неправильной работе для более глубоких различий (то есть, различий, не выраженных на поверхности структуры). Наследуйте класс PureComponent только тогда, когда вы ожидаете использовать простые пропсы и состояние 552 |

553 |

Источник: ru.reactjs.org

554 |
555 |
556 | 557 | 558 |
559 | Что такое Компонент высшего порядка (Higher-Order Component, HOC)? 560 |
561 |
562 |

563 | Говоря просто, компонент высшего порядка — это функция, которая принимает компонент и возвращает новый компонент. HOC часто встречаются в сторонних библиотеках, например connect в Redux и createFragmentContainer в Relay. 564 | 565 | const EnhancedComponent = higherOrderComponent(WrappedComponent); 566 |

567 |

568 | Давайте реализуем функцию withSubscription — она будет создавать компоненты и подписывать их на обновления DataSource (наподобие CommentList и BlogPost). Функция будет принимать оборачиваемый компонент и через пропсы передавать ему новые данные: 569 | 570 | const CommentListWithSubscription = withSubscription( 571 | CommentList, 572 | (DataSource) => DataSource.getComments() 573 | ); 574 | 575 | const BlogPostWithSubscription = withSubscription( 576 | BlogPost, 577 | (DataSource, props) => DataSource.getBlogPost(props.id) 578 | ); 579 |

580 |

581 | Первый параметр — это оборачиваемый компонент. Второй — функция, которая извлекает нужные нам данные, она получает DataSource и текущие пропсы. 582 |

583 |

584 | Заметьте, что HOC ничего не меняет и не наследует поведение оборачиваемого компонента, вместо этого HOC оборачивает оригинальный компонент в контейнер посредством композиции. HOC является чистой функцией без побочных эффектов. Вот и всё! Оборачиваемый компонент получает все пропсы, переданные контейнеру, а также проп data. Для HOC не важно, как будут использоваться данные, а оборачиваемому компоненту не важно, откуда они берутся. 585 |

586 |

Источник: ru.reactjs.org

587 |
588 |
589 | 590 |
591 | Что такое хуки в React? 592 |
593 |
594 |

595 | Хуки — нововведение в React 16.8, которое позволяет использовать состояние и другие возможности React без написания классов. Хуки — это функции, с помощью которых вы можете «подцепиться» к состоянию и методам жизненного цикла React из функциональных компонентов. Хуки не работают внутри классов — они дают вам возможность использовать React без классов. 596 |

597 |

598 | Хук состояния - useState 599 | 600 | import React, { useState } from 'react'; 601 | 602 | function Example() { 603 | // Объявляем новую переменную состояния "count" 604 | const [count, setCount] = useState(0); 605 | 606 | return ( 607 |

608 |

You clicked {count} times

609 | 612 |
613 | ); 614 | } 615 | 616 | Вызов useState возвращает две вещи: текущее значение состояния и функцию для его обновления. Эту функцию можно использовать где угодно, например, в обработчике событий. Она схожа с this.setState в классах, но не сливает новое и старое состояние вместе. Единственный аргумент useState — это начальное состояние. В примере выше — это 0, так как наш счётчик начинается с нуля. 617 |

618 |

619 | Хук эффекта - useEffect 620 | 621 | import React, { useState, useEffect } from 'react'; 622 | 623 | function Example() { 624 | const [count, setCount] = useState(0); 625 | 626 | // По принципу componentDidMount и componentDidUpdate: 627 | useEffect(() => { 628 | // Обновляем заголовок документа, используя API браузера 629 | document.title = `Вы нажали ${count} раз`; 630 | }); 631 | 632 | return ( 633 |

634 |

Вы нажали {count} раз

635 | 638 |
639 | ); 640 | } 641 | 642 | Когда вы вызываете useEffect, React получает указание запустить вашу функцию с «эффектом» после того, как он отправил изменения в DOM. Поскольку эффекты объявляются внутри компонента, у них есть доступ к его пропсам и состоянию. По умолчанию, React запускает эффекты после каждого рендера, включая первый рендер. 643 |

644 |

Источник: ru.reactjs.org

645 |
646 |
647 | 648 |
649 | Что такое порталы в React? 650 |
651 |
652 |

653 | Порталы позволяют рендерить дочерние элементы в DOM-узел, который находится вне DOM-иерархии родительского компонента. 654 | 655 | ReactDOM.createPortal(child, container) 656 |

657 |

658 | Первый аргумент (child) — это любой React-компонент, который может быть отрендерен, такой как элемент, строка или фрагмент. Следующий аргумент (container) — это DOM-элемент. 659 |

660 |

661 | Типовой случай применения порталов — когда в родительском компоненте заданы стили overflow: hidden или z-index, но вам нужно чтобы дочерний элемент визуально выходил за рамки своего контейнера. Например, диалоги, всплывающие карточки и всплывающие подсказки. 662 |

663 |

Источник: ru.reactjs.org

664 |
665 |
666 | 667 |
668 | Что такое React Reconciliation (Cверка) и как он работает? 669 |
670 |
671 |

672 | Reconciliation (Cверка) - это процесс, посредством которого React обновляет DOM. Когда состояние компонента изменяется, React должен рассчитать необходимость обновления DOM. Это делается путем создания виртуального DOM и сравнения его с текущим DOM. В этом контексте виртуальный DOM будет содержать новое состояние компонента. 673 |

674 |

675 | При сравнении двух деревьев первым делом React сравнивает два корневых элемента. Поведение различается в зависимости от типов корневых элементов. 676 |

677 |

678 | Всякий раз, когда корневые элементы имеют различные типы, React уничтожает старое дерево и строит новое с нуля. 679 |

680 |

681 | При сравнении двух React DOM-элементов одного типа, React смотрит на атрибуты обоих, сохраняет лежащий в основе этих элементов DOM-узел и обновляет только изменённые атрибуты. 682 |

683 |

684 | По умолчанию при рекурсивном обходе дочерних элементов DOM-узла React проходит по обоим спискам потомков одновременно и создаёт мутацию, когда находит отличие. Эта неэффективность может стать проблемой. Когда у дочерних элементов есть ключи, React использует их, чтобы сопоставить потомков исходного дерева с потомками последующего дерева. 685 |

686 |

Источник: 687 | css-tricks.com, 688 | ru.reactjs.org 689 |

690 |
691 |
692 | 693 |
694 | Можно создавать анимации в React? 695 |
696 |
697 |

698 | React может использоваться для создания крутых анимаций! В качестве примера посмотрите библиотеки React Transition Group и React Motion. 699 |

700 |

Источник: ru.reactjs.org

701 |
702 |
703 | 704 |
705 | 706 | **Flux-архитектура, Redux и MobX**: 707 | 708 |
709 | Что такое Flux - архитектура? Какие сущности она имеет? 710 |
711 |

712 | Flux-архитектура — архитектурный подход или набор шаблонов программирования для построения пользовательского интерфейса веб-приложений, сочетающийся с реактивным программированием и построенный на однонаправленных потоках данных. 713 |

714 |

715 | Основной отличительной особенностью Flux является односторонняя направленность передачи данных между компонентами Flux-архитектуры. Архитектура накладывает ограничения на поток данных, в частности, исключая возможность обновления состояния компонентов самими собой. Такой подход делает поток данных предсказуемым и позволяет легче проследить причины возможных ошибок в программном обеспечении. 716 |

717 |

718 | В минимальном варианте Flux-архитектура может содержать три слоя, взаимодействующие по порядку: 719 |

720 | 734 |

Источник: wikipedia.org

735 |
736 |
737 | 738 |
739 | 740 | **Веб - технологии**: 741 | 742 |
743 | Что такое HTTP? 744 |
745 |

746 | Протокол передачи гипертекста (Hypertext Transfer Protocol - HTTP) - это прикладной протокол для передачи гипертекстовых документов, таких как HTML. Он создан для связи между веб-браузерами и веб-серверами, хотя в принципе HTTP может использоваться и для других целей. Протокол следует классической клиент-серверной модели, когда клиент открывает соединение для создания запроса, а затем ждет ответа. HTTP - это протокол без сохранения состояния, то есть сервер не сохраняет никаких данных (состояние) между двумя парами "запрос-ответ". Несмотря на то, что HTTP основан на TCP/IP, он также может использовать любой другой протокол транспортного уровня с гарантированной доставкой. 747 |

748 |

749 | Ниже перечислены общие функции, управляемые с HTTP: 750 |

751 | 768 |

Источник: developer.mozilla.org

769 |
770 |
771 | 772 |
773 | Из чего состоит HTTP-запрос? 774 |
775 | http request
 776 | 
 777 | 778 |

779 | Запросы содержат следующие элементы: 780 |

781 | 798 |

Источник: developer.mozilla.org

799 |
800 |
801 | 802 |
803 | Какие методы может иметь HTTP-запрос? 804 |
805 |

806 | HTTP определяет множество методов запроса, которые указывают, какое желаемое действие выполнится для данного ресурса. Несмотря на то, что их названия могут быть существительными, эти методы запроса иногда называются HTTP глаголами. Каждый реализует свою семантику, но каждая группа команд разделяет общие свойства: так, методы могут быть безопасными, идемпотентными или кэшируемыми. 807 |

808 | 837 |

Источник: developer.mozilla.org

838 |
839 |
840 | 841 |
842 | Что такое Cross-Origin Resource Sharing (CORS)? 843 |
844 |

845 | Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент. Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом. 846 |

847 |

848 | В целях безопасности браузеры ограничивают cross-origin запросы, инициируемые скриптами. Например, XMLHttpRequest и Fetch API следуют политике одного источника (same-origin policy). Это значит, что web-приложения, использующие такие API, могут запрашивать HTTP-ресурсы только с того домена, с которого были загружены, пока не будут использованы CORS-заголовки. 849 |

850 |

Источник: developer.mozilla.org

851 |
852 |
853 | 854 |
855 | Что такое HTTP cookie и для чего их используют? 856 |
857 |

858 | HTTP cookie (web cookie, cookie браузера) - это небольшой фрагмент данных, отправляемый сервером на браузер пользователя, который тот может сохранить и отсылать обратно с новым запросом к данному серверу. Это, в частности, позволяет узнать, с одного ли браузера пришли оба запроса (например, для аутентификации пользователя). Они запоминают информацию о состоянии для протокола HTTP, который сам по себе этого делать не умеет. 859 |

860 |

861 | Cookie используются, главным образом, для: 862 |

863 | 874 |

875 | Получив HTTP-запрос, вместе с откликом сервер может отправить заголовок Set-Cookie с ответом. Cookie обычно запоминаются браузером и посылаются в значении заголовка HTTP Cookie с каждым новым запросом к одному и тому же серверу. Можно задать срок действия cookie, а также срок его жизни, после которого cookie не будет отправляться. Также можно указать ограничения на путь и домен, то есть указать, в течении какого времени и к какому сайту оно отсылается. 876 |

877 |

878 | Куки можно создавать через JavaScript при помощи свойства Document.cookie. Если флаг HttpOnly не установлен, то и доступ к существующим cookies можно получить через JavaScript. 879 |

880 | 881 | document.cookie = "yummy_cookie=choco"; 882 | document.cookie = "tasty_cookie=strawberry"; 883 |

Источник: developer.mozilla.org

884 |
885 |
886 | 887 |
888 | Какие существуют основные принципы ООП? 889 |
890 |
891 |

892 | Базовые принципы ООП: 893 |

894 | 908 |

909 | 910 | Источник: tproger.ru 911 | 912 |

913 |
914 |
915 | 916 |
917 | Что такое SOLID (объектно-ориентированное программирование)? 918 |
919 |
920 |

921 | SOLID (сокр. от англ. single responsibility, open-closed, Liskov substitution, interface segregation и dependency inversion) в программировании — мнемонический акроним, введённый Майклом Фэзерсом (Michael Feathers) для первых пяти принципов, названных Робертом Мартином в начале 2000-х, которые означали пять основных принципов объектно-ориентированного программирования и проектирования. Принципы SOLID — это руководства, которые также могут применяться во время работы над существующим программным обеспечением для его улучшения - например для удаления «дурно пахнущего кода». 922 |

923 |

924 | Избавиться от "признаков плохого проекта" помогают следующие пять принципов SOLID: 925 |

926 | 943 |

944 | 945 | Источник: wikipedia.org 946 | 947 |

948 |
949 |
950 | 951 |
952 | Что такое Babel и для чего он используется? 953 |
954 |
955 |

956 | Babel.JS – это транспайлер, переписывающий код на ES-2015 в код на предыдущем стандарте ES5. 957 |

958 |

959 | Обычно Babel.JS работает на сервере в составе системы сборки JS-кода (например webpack или brunch) и автоматически переписывает весь код в ES5. 960 |

961 |

962 | Настройка такой конвертации тривиальна, единственно – нужно поднять саму систему сборки, а добавить к ней Babel легко, плагины есть к любой из них. 963 |

964 |

965 | Конфигурация Babel прописывается в файле babel.config.js, либо в .babelrc для настроек одного пакета, а также в package.json или .babelrc.js 966 |

967 |

968 | Пример конфига в babel.config.js: 969 | 970 | module.exports = function (api) { 971 | api.cache(true); 972 | 973 | const presets = [ ... ]; 974 | const plugins = [ ... ]; 975 | 976 | return { 977 | presets, 978 | plugins 979 | }; 980 | } 981 |

982 |

983 | 984 | Источник: 985 | learn.javascript.ru, 986 | babeljs.io 987 | 988 |

989 |
990 |
991 | 992 |
993 | Для чего используется WebSocket? В чем принцип его работы? 994 |
995 |
996 |

997 | Протокол WebSocket («веб-сокет»), описанный в спецификации RFC 6455, обеспечивает возможность обмена данными между браузером и сервером через постоянное соединение. Данные передаются по нему в обоих направлениях в виде «пакетов», без разрыва соединения и дополнительных HTTP-запросов. 998 |

999 |

1000 | Чтобы открыть веб-сокет-соединение, нам нужно создать объект new WebSocket, указав в url-адресе специальный протокол ws: 1001 | 1002 | let socket = new WebSocket("ws://javascript.info"); 1003 | 1004 |

1005 |

1006 | Как только объект WebSocket создан, мы должны слушать его события. Их всего 4: 1007 |

1008 | 1022 |

1023 | Вот пример: 1024 |

1025 |

1026 | 1027 | let socket = new WebSocket("wss://javascript.info/article/websocket/demo/hello"); 1028 | 1029 | socket.onopen = function(e) { 1030 | alert("[open] Соединение установлено"); 1031 | alert("Отправляем данные на сервер"); 1032 | socket.send("Меня зовут Джон"); 1033 | }; 1034 | 1035 | socket.onmessage = function(event) { 1036 | alert(`[message] Данные получены с сервера: ${event.data}`); 1037 | }; 1038 | 1039 | socket.onclose = function(event) { 1040 | if (event.wasClean) { 1041 | alert(`[close] Соединение закрыто чисто, код=${event.code} причина=${event.reason}`); 1042 | } else { 1043 | // например, сервер убил процесс или сеть недоступна 1044 | // обычно в этом случае event.code 1006 1045 | alert('[close] Соединение прервано'); 1046 | } 1047 | }; 1048 | 1049 | socket.onerror = function(error) { 1050 | alert(`[error] ${error.message}`); 1051 | }; 1052 |

1053 |

1054 | Вызов socket.send(body) принимает body в виде строки или любом бинарном формате включая Blob, ArrayBuffer и другие. Дополнительных настроек не требуется, просто отправляем в любом формате. При получении данных, текст всегда поступает в виде строки. А для бинарных данных мы можем выбрать один из двух форматов: Blob или ArrayBuffer. 1055 |

1056 |

1057 | 1058 | Источник: javascript.ru 1059 | 1060 |

1061 |
1062 |
1063 | 1064 |
1065 | Что такое Веб-компоненты и какие технологии в них используются? 1066 |
1067 |
1068 |

1069 | Веб-компоненты — технология, которая позволяет создавать многократно используемые компоненты в веб-документах и веб-приложениях. Веб-компоненты поддерживаются веб-браузерами напрямую и не требуют дополнительных библиотек для работы. 1070 |

1071 |

1072 | Веб-компоненты включают четыре технологии, каждая из которых может использоваться отдельно от других: 1073 |

1074 | 1088 |

1089 | 1090 | Источник: 1091 | wikipedia.org 1092 | 1093 |

1094 |
1095 |
1096 | -------------------------------------------------------------------------------- /donate-qr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/evgenii-studitskikh/react-ru-interview-questions/4b57ceff7440bb0397dd5fd07936d96abad569ee/donate-qr.png --------------------------------------------------------------------------------