[{"data":1,"prerenderedAt":1378},["ShallowReactive",2],{"$fBhmNOCwffkmeZHPNsQtqgcgSgW8vh2GO4JEpHrK77_E":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":89,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":92,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":97,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":442,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":664,"mdc-qpsrze-key":684,"mdc--ilzlrp-key":696,"mdc-69vgbl-key":704,"mdc--ab42ip-key":730,"mdc--je2arm-key":739,"mdc--piewil-key":770,"mdc-t6uzj7-key":799,"mdc-mvzahd-key":832,"mdc-uvlxri-key":868,"mdc--oje6dg-key":876,"mdc-bumr91-key":936,"mdc-b309i6-key":967,"mdc-f92cyx-key":1053,"mdc-eimg08-key":1089,"mdc-879qc5-key":1146,"mdc-omexks-key":1154,"mdc--yxr7kg-key":1349},{"content":4,"quizQuestionContent":60,"type":79,"pageMeta":80},[5,9,13,16,20,24,27,30,34,37,40,44,47,50,54,57],{"id":6,"value":7,"isTypeH1":8},"1913","Инициаторы записи cookie в браузере",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4401","Суть вопроса: кто «инициирует»?","essence-of-the-question-who-initiates",{"id":14,"value":15,"isTypeParagraph":8},"10129","Под «инициатором записи cookie» часто смешиваются две разные роли: источник команды на установку cookie и исполнитель фактической записи в cookie-хранилище.  \nКоманда на установку может исходить от сервера (через `Set-Cookie`) или от JavaScript в документе (через setter `document.cookie` или через `cookieStore.set()`), а фактическую операцию сохранения/обновления выполняет браузер (user agent), так как cookie store принадлежит браузеру и подчиняется его правилам.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"652","Технически корректнее формулировать ответ так: «инициатор команды — server или js; инициатор фактической записи (исполнитель) — браузер», поскольку наличие команды не гарантирует успешной установки из-за политик и ограничений контекста.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4402","Запись cookie по HTTP (Set-Cookie)","http-cookie-write-via-http-set-cookie",{"id":25,"value":26,"isTypeParagraph":8},"10130","При установке cookie по HTTP инициатором команды является сервер: он отправляет в ответе заголовок `Set-Cookie`, предназначенный для передачи параметров cookie в браузер.  \nДалее браузер разбирает имя/значение и атрибуты, проверяет применимость и либо сохраняет cookie, либо отклоняет установку (например, из‑за требований безопасности и ограничений приватности).\n\nПримеры HTTP-ответа:\n\n```\nHTTP/1.1 200 OK\nContent-Type: text/html\nSet-Cookie: SID=abc123; Path=/; HttpOnly; Secure; SameSite=Lax\n\nHTTP/1.1 200 OK\nSet-Cookie: PREF=dark; Max-Age=31536000; Path=/; Secure; SameSite=None\n```\n\nПример последующего запроса, где браузер сам добавляет заголовок `Cookie` с подходящими значениями:\n\n```\nGET /account HTTP/1.1\nHost: example.com\nCookie: SID=abc123; PREF=dark\n```",{"id":28,"description":29,"titleAlert":19,"isTypeAlertWarning":8},"712","Наличие `Set-Cookie` не означает гарантированную запись: часть cookie может блокироваться или модифицироваться (например, по атрибутам `SameSite`/`Secure` и по настройкам браузера).",{"id":31,"value":32,"anchor":33,"isTypeH2":8},"4403","Запись cookie из JavaScript (document.cookie)","javascript-cookie-write-document-cookie",{"id":35,"value":36,"isTypeParagraph":8},"10131","При установке cookie из JavaScript инициатором команды является код страницы, который присваивает строку в `document.cookie`, причём за одно присваивание задаётся одна cookie.  \nБраузер интерпретирует строку вида `key=value; attr=...` и применяет её к cookie текущего контекста с учётом области видимости (domain/path), срока жизни, а также ограничений доступа (например, cookie с `HttpOnly` не читаются через `document.cookie`).\n\nПример установки cookie:  \n```\ndocument.cookie = \"theme=dark; Path=/; Max-Age=86400; SameSite=Lax\"\n```\n\nПример удаления cookie через истёкшую дату:  \n```\ndocument.cookie = \"theme=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT\"\n```\n\nПример чтения cookie:  \n```\nconst cookieLine = document.cookie\n```",{"id":38,"description":39,"titleAlert":19,"isTypeAlertWarning":8},"713","Через `document.cookie` не устанавливается `HttpOnly`, поэтому cookie, которые не должны быть доступны JavaScript (например, идентификатор сессии), обычно инициируются сервером через `Set-Cookie` с `HttpOnly`.",{"id":41,"value":42,"anchor":43,"isTypeH2":8},"4404","Cookie Store API (cookieStore.set)","cookie-store-api-cookiestore-set",{"id":45,"value":46,"isTypeParagraph":8},"10132","Cookie Store API предоставляет асинхронный интерфейс для установки cookie из документа или service worker: инициатором команды выступает скрипт, а запись выполняется браузером.  \nОперация установки выполняется методом `cookieStore.set()`, который обычно требует безопасного контекста и возвращает промис, поэтому типичный шаблон включает `await` и обработку ошибок.\n\nПример установки cookie по имени и значению:  \n\n```\nawait cookieStore.set(\"cookie1\", \"cookie1-value\")\n```\n\nПример установки cookie объектом:\n\n```\nasync function cookieTest() {\n  const day = 24 * 60 * 60 * 1000;\n\n  try {\n    await cookieStore.set({\n      name: \"cookie2\",\n      value: \"cookie2-value\",\n      expires: Date.now() + day,\n      partitioned: true\n    });\n  } catch (error) {\n    console.log(`Error setting cookie2: ${error}`);\n  }\n}\n```",{"id":48,"description":49,"titleAlert":19,"isTypeAlertInfo":8},"653","На практике часто встречается разделение ответственности: серверные cookie используются для security-критичных сценариев, а клиентские cookie — для некритичных настроек интерфейса, при этом фактическая запись всегда остаётся за браузером.",{"id":51,"value":52,"anchor":53,"isTypeH2":8},"4405","Разбор «инициатор vs исполнитель»","initiator-vs-executor",{"id":55,"value":56,"isTypeParagraph":8},"10133","Инициатор команды на установку cookie может быть внешним по отношению к браузеру (сервер) или внутренним (скрипт), но исполнитель сохранения — браузер (user agent), поскольку cookie являются механизмом состояния, управляемым клиентом.  \nЭто разделение помогает объяснить поведение безопасности: `HttpOnly` ограничивает доступ скриптов, но не отменяет автоматическую отправку cookie браузером в запросах при выполнении условий области видимости.  \nТакже встречаются дополнительные источники команд (например, расширения браузера), однако даже в этих случаях физическое изменение cookie store выполняется браузером.\n\nТаблица ролей и каналов установки:\n\n| Канал установки | Инициатор команды | Исполнитель записи | Типичный пример |\n|---|---|---|---|\n| HTTP `Set-Cookie` | Сервер | Браузер (user agent) | `Set-Cookie: SID=...; HttpOnly; Secure` |\n| `document.cookie` | Скрипт страницы | Браузер (user agent) | `document.cookie = \"theme=dark; Path=/\"` |\n| `cookieStore.set()` | Скрипт (страница/SW) | Браузер (user agent) | `await cookieStore.set(\"a\",\"b\")` |\n| API расширений | Расширение | Браузер (user agent) | установка через API cookies |\n\nСхема потоков (упрощённо):\n\n```\nserver --(response: Set-Cookie)--> browser(cookie store)\njs -----(document.cookie / cookieStore.set)--> browser(cookie store)\nbrowser --(request: Cookie)--> server\n```\n",{"id":58,"value":59,"isTypeParagraph":8},"10134","Кратко: инициирование установки cookie возможно со стороны сервера (`Set-Cookie`) и со стороны скрипта (`document.cookie`/`cookieStore.set()`), но реальную запись и применение правил всегда выполняет браузер (user agent).",{"id":61,"options":62,"hint":76,"solution":77,"description":78},"1152",[63,67,70,73],{"id":64,"label":65,"isCorrect":66},"4753","Инициатором фактической записи является операционная система, потому что cookie пишутся системными службами, а браузер лишь отображает значения и не управляет хранилищем.",false,{"id":68,"label":69,"isCorrect":66},"4754","Инициатором фактической записи является JavaScript страницы, потому что cookie появляются только после выполнения `document.cookie`, а `Set-Cookie` не влияет на сохранение.  ",{"id":71,"label":72,"isCorrect":66},"4755","Инициатором фактической записи является сервер, потому что cookie создаются и сохраняются на backend, а браузер только пересылает их в запросах без принятия решений.  ",{"id":74,"label":75,"isCorrect":8},"4756","Инициатором фактической записи является браузер (user agent), а инициатором команды может быть сервер через `Set-Cookie` или скрипт через `document.cookie`/`cookieStore.set()`.  ","Следует разделить «кто отдаёт команду на установку cookie» и «кто выполняет запись в cookie store», затем сопоставить это с `Set-Cookie`, `document.cookie` и `cookieStore.set()`.","**Правильный ответ: 4** - Инициатором фактической записи является браузер (user agent), а инициатором команды может быть сервер через `Set-Cookie` или скрипт через `document.cookie`/`cookieStore.set()`.  ","Кто является инициатором записи cookie в браузере?","quizQuestion",{"title":78,"description":81,"ogTitle":7,"ogDescription":81,"ogImageUrl":82,"canonical":19,"ogLocale":83,"ogSiteName":84,"ogImageType":85,"ogImageWidth":86,"ogImageHeight":87,"ogType":88,"ogUrl":19},"Роль сервера, js и браузера при установке cookie: set-cookie, document.cookie и cookiestore api","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":90,"siteUrl":91},"GOOD WEB JOB!","https://goodwebjob.ru",[93],{"label":94,"slug":95,"to":96},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":98,"navigationSublist":106},[99,102],{"path":96,"isActive":66,"name":100,"icon":101,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":103,"isActive":8,"name":104,"icon":105,"isNavbarMobileDisabled":66},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[107,116,143,155,161,302,326,335,341,403,424,430],{"title":108,"list":109,"isOpened":66},"Bash",[110,113],{"name":111,"path":112,"isActive":66},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":114,"path":115,"isActive":66},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":117,"list":118,"isOpened":66},"CSS",[119,122,125,128,131,134,137,140],{"name":120,"path":121,"isActive":66},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":123,"path":124,"isActive":66},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":126,"path":127,"isActive":66},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":129,"path":130,"isActive":66},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":132,"path":133,"isActive":66},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":135,"path":136,"isActive":66},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":138,"path":139,"isActive":66},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":141,"path":142,"isActive":66},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":144,"list":145,"isOpened":66},"Git",[146,149,152],{"name":147,"path":148,"isActive":66},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":150,"path":151,"isActive":66},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":153,"path":154,"isActive":66},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":156,"list":157,"isOpened":66},"HTML",[158],{"name":159,"path":160,"isActive":66},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":162,"list":163,"isOpened":66},"JavaScript",[164,167,170,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290,293,296,299],{"name":165,"path":166,"isActive":66},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":168,"path":169,"isActive":66},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":171,"path":172,"isActive":66},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":174,"path":175,"isActive":66},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":177,"path":178,"isActive":66},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":180,"path":181,"isActive":66},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":183,"path":184,"isActive":66},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":186,"path":187,"isActive":66},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":189,"path":190,"isActive":66},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":192,"path":193,"isActive":66},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":195,"path":196,"isActive":66},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":198,"path":199,"isActive":66},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":201,"path":202,"isActive":66},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":204,"path":205,"isActive":66},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":207,"path":208,"isActive":66},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":210,"path":211,"isActive":66},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":213,"path":214,"isActive":66},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":216,"path":217,"isActive":66},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":219,"path":220,"isActive":66},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":222,"path":223,"isActive":66},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":225,"path":226,"isActive":66},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":228,"path":229,"isActive":66},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":231,"path":232,"isActive":66},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":234,"path":235,"isActive":66},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":237,"path":238,"isActive":66},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":240,"path":241,"isActive":66},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":243,"path":244,"isActive":66},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":246,"path":247,"isActive":66},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":249,"path":250,"isActive":66},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":252,"path":253,"isActive":66},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":255,"path":256,"isActive":66},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":258,"path":259,"isActive":66},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":261,"path":262,"isActive":66},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":264,"path":265,"isActive":66},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":267,"path":268,"isActive":66},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":270,"path":271,"isActive":66},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":273,"path":274,"isActive":66}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":276,"path":277,"isActive":66},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":279,"path":280,"isActive":66},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":282,"path":283,"isActive":66},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":285,"path":286,"isActive":66},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":288,"path":289,"isActive":66},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":291,"path":292,"isActive":66},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":294,"path":295,"isActive":66},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":297,"path":298,"isActive":66},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":300,"path":301,"isActive":66},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":303,"list":304,"isOpened":66},"React",[305,308,311,314,317,320,323],{"name":306,"path":307,"isActive":66},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":309,"path":310,"isActive":66},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":312,"path":313,"isActive":66},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":315,"path":316,"isActive":66},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":318,"path":319,"isActive":66},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":321,"path":322,"isActive":66},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":324,"path":325,"isActive":66},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":327,"list":328,"isOpened":66},"Алгоритмы",[329,332],{"name":330,"path":331,"isActive":66},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":333,"path":334,"isActive":66},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":336,"list":337,"isOpened":66},"Дебаггинг",[338],{"name":339,"path":340,"isActive":66},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":342,"list":343,"isOpened":66},"Компьютерные сети",[344,347,350,353,356,359,362,365,368,371,374,377,380,383,385,388,391,394,397,400],{"name":345,"path":346,"isActive":66},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":348,"path":349,"isActive":66},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":351,"path":352,"isActive":66},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":354,"path":355,"isActive":66},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":357,"path":358,"isActive":66},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":360,"path":361,"isActive":66},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":363,"path":364,"isActive":66},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":366,"path":367,"isActive":66},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":369,"path":370,"isActive":66},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":372,"path":373,"isActive":66},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":375,"path":376,"isActive":66},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":378,"path":379,"isActive":66},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":381,"path":382,"isActive":66},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":78,"path":384,"isActive":66},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":386,"path":387,"isActive":66},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":389,"path":390,"isActive":66},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":392,"path":393,"isActive":66},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":395,"path":396,"isActive":66},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":398,"path":399,"isActive":66},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":401,"path":402,"isActive":66},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":404,"list":405,"isOpened":66},"Отрисовка в браузере",[406,409,412,415,418,421],{"name":407,"path":408,"isActive":66},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":410,"path":411,"isActive":66},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":413,"path":414,"isActive":66},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":416,"path":417,"isActive":66},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":419,"path":420,"isActive":66},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":422,"path":423,"isActive":66},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":425,"list":426,"isOpened":66},"Ревью кода",[427],{"name":428,"path":429,"isActive":66},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":431,"list":432,"isOpened":66},"Теория вероятности",[433,436,439],{"name":434,"path":435,"isActive":66},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":437,"path":438,"isActive":66},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":440,"path":441,"isActive":66},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":443},[444,447,449,451,453,456,459,461,463,465,467,469,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,654,656,658,660,662],{"name":445,"value":446},"Теоретические задания","theoretical-tasks",{"name":201,"value":448},"what-this-code-will-return-typeof-function",{"name":100,"value":450},"where-to-begin",{"name":168,"value":452},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":454,"value":455},"Backend","backend",{"name":457,"value":458},"Frontend","frontend",{"name":165,"value":460},"prototype-what-logical-values-will-be-received-in-console-log",{"name":282,"value":462},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":273,"value":464},"find-non-repeating-numbers-in-an-array",{"name":246,"value":466},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":252,"value":468},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":470,"value":471},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":258,"value":473},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":174,"value":475},"what-value-will-the-console-output-with-object-property",{"name":177,"value":477},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":249,"value":479},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":279,"value":481},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":285,"value":483},"determines-whether-a-word-is-a-palindrome",{"name":264,"value":485},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":291,"value":487},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":255,"value":489},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":261,"value":491},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":267,"value":493},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":300,"value":495},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":270,"value":497},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":276,"value":499},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":180,"value":501},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":183,"value":503},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":195,"value":505},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":198,"value":507},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":297,"value":509},"unifying-values-in-an-array",{"name":288,"value":511},"flattening-the-array",{"name":186,"value":513},"what-will-the-book-get-upper-name-method-return",{"name":294,"value":515},"string-compression",{"name":192,"value":517},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":204,"value":519},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":345,"value":521},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":351,"value":523},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":354,"value":525},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":357,"value":527},"key-differences-between-tcp-and-udp",{"name":360,"value":529},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":363,"value":531},"what-is-http-and-what-does-it-consist-of",{"name":366,"value":533},"what-are-http-headers-and-why-do-we-need-them",{"name":369,"value":535},"what-are-http-parameters",{"name":372,"value":537},"where-is-the-html-code-located-in-the-http-response-structure",{"name":159,"value":539},"what-is-html",{"name":375,"value":541},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":378,"value":543},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":381,"value":545},"what-is-a-cookie",{"name":78,"value":547},"who-initiates-the-cookie-recording-in-the-browser",{"name":386,"value":549},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":551,"value":552},"Лайвкодинг","livecoding",{"name":171,"value":554},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":392,"value":556},"is-everything-that-goes-through-https-secure",{"name":395,"value":558},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":398,"value":560},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":410,"value":562},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":407,"value":564},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":413,"value":566},"what-is-blocking-the-page-rendering-in-the-browser",{"name":416,"value":568},"what-is-dom-in-a-browser-what-is-cssom",{"name":419,"value":570},"what-are-nodes-in-the-dom",{"name":422,"value":572},"what-does-cssom-consist-of",{"name":120,"value":574},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":123,"value":576},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":126,"value":578},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":129,"value":580},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":132,"value":582},"there-is-an-html-code-will-font-weight-affect-span",{"name":135,"value":584},"what-are-the-differences-between-flexbox-and-grid",{"name":138,"value":586},"do-flexbox-and-grid-replace-each-other",{"name":141,"value":588},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":104,"value":590},"tasks",{"name":207,"value":592},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":210,"value":594},"what-is-this-in-javascript",{"name":213,"value":596},"what-is-an-event-loop-and-how-does-it-work",{"name":216,"value":598},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":219,"value":600},"what-does-the-typeof-operator-show-in-javascript",{"name":222,"value":602},"what-types-of-data-exist-in-javascript",{"name":225,"value":604},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":228,"value":606},"what-will-typeof-return-for-an-array",{"name":231,"value":608},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":234,"value":610},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":237,"value":612},"what-does-typeof-return-for-new-set-in-javascript",{"name":306,"value":614},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":312,"value":616},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":315,"value":618},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":318,"value":620},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":321,"value":622},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":339,"value":624},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":147,"value":626},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":150,"value":628},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":153,"value":630},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":428,"value":632},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":111,"value":634},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":114,"value":636},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":330,"value":638},"what-is-algorithmic-complexity",{"name":333,"value":640},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":240,"value":642},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":401,"value":644},"how-can-a-user-be-authorized-on-a-website",{"name":243,"value":646},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":434,"value":648},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":437,"value":650},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":440,"value":652},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":94,"value":95},{"name":389,"value":655},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":348,"value":657},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":189,"value":659},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":309,"value":661},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":324,"value":663},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":665,"copyright":668,"reportError":669,"socialNetwork":671},{"link":666,"title":667},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":670,"link":666},"Сообщить об ошибке",{"label":672,"socialNetworkList":673},"Мы в соцсетях:",[674,677,680],{"icon":19,"link":675,"title":676},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":678,"link":666,"title":679},"ic:baseline-telegram","Telegram",{"icon":681,"link":682,"title":683},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":685,"body":686},{},{"type":687,"children":688},"root",[689],{"type":690,"tag":691,"props":692,"children":693},"element","p",{},[694],{"type":695,"value":78},"text",{"data":697,"body":698},{},{"type":687,"children":699},[700],{"type":690,"tag":691,"props":701,"children":702},{},[703],{"type":695,"value":65},{"data":705,"body":706},{},{"type":687,"children":707},[708],{"type":690,"tag":691,"props":709,"children":710},{},[711,713,720,722,728],{"type":695,"value":712},"Инициатором фактической записи является JavaScript страницы, потому что cookie появляются только после выполнения ",{"type":690,"tag":714,"props":715,"children":717},"code",{"className":716},[],[718],{"type":695,"value":719},"document.cookie",{"type":695,"value":721},", а ",{"type":690,"tag":714,"props":723,"children":725},{"className":724},[],[726],{"type":695,"value":727},"Set-Cookie",{"type":695,"value":729}," не влияет на сохранение.",{"data":731,"body":732},{},{"type":687,"children":733},[734],{"type":690,"tag":691,"props":735,"children":736},{},[737],{"type":695,"value":738},"Инициатором фактической записи является сервер, потому что cookie создаются и сохраняются на backend, а браузер только пересылает их в запросах без принятия решений.",{"data":740,"body":741},{},{"type":687,"children":742},[743],{"type":690,"tag":691,"props":744,"children":745},{},[746,748,753,755,760,762,768],{"type":695,"value":747},"Инициатором фактической записи является браузер (user agent), а инициатором команды может быть сервер через ",{"type":690,"tag":714,"props":749,"children":751},{"className":750},[],[752],{"type":695,"value":727},{"type":695,"value":754}," или скрипт через ",{"type":690,"tag":714,"props":756,"children":758},{"className":757},[],[759],{"type":695,"value":719},{"type":695,"value":761},"/",{"type":690,"tag":714,"props":763,"children":765},{"className":764},[],[766],{"type":695,"value":767},"cookieStore.set()",{"type":695,"value":769},".",{"data":771,"body":772},{},{"type":687,"children":773},[774],{"type":690,"tag":691,"props":775,"children":776},{},[777,779,784,786,791,793,798],{"type":695,"value":778},"Следует разделить «кто отдаёт команду на установку cookie» и «кто выполняет запись в cookie store», затем сопоставить это с ",{"type":690,"tag":714,"props":780,"children":782},{"className":781},[],[783],{"type":695,"value":727},{"type":695,"value":785},", ",{"type":690,"tag":714,"props":787,"children":789},{"className":788},[],[790],{"type":695,"value":719},{"type":695,"value":792}," и ",{"type":690,"tag":714,"props":794,"children":796},{"className":795},[],[797],{"type":695,"value":767},{"type":695,"value":769},{"data":800,"body":801},{},{"type":687,"children":802},[803],{"type":690,"tag":691,"props":804,"children":805},{},[806,812,814,819,820,825,826,831],{"type":690,"tag":807,"props":808,"children":809},"strong",{},[810],{"type":695,"value":811},"Правильный ответ: 4",{"type":695,"value":813}," - Инициатором фактической записи является браузер (user agent), а инициатором команды может быть сервер через ",{"type":690,"tag":714,"props":815,"children":817},{"className":816},[],[818],{"type":695,"value":727},{"type":695,"value":754},{"type":690,"tag":714,"props":821,"children":823},{"className":822},[],[824],{"type":695,"value":719},{"type":695,"value":761},{"type":690,"tag":714,"props":827,"children":829},{"className":828},[],[830],{"type":695,"value":767},{"type":695,"value":769},{"data":833,"body":834},{},{"type":687,"children":835},[836],{"type":690,"tag":691,"props":837,"children":838},{},[839,841,845,847,852,854,859,861,866],{"type":695,"value":840},"Под «инициатором записи cookie» часто смешиваются две разные роли: источник команды на установку cookie и исполнитель фактической записи в cookie-хранилище.",{"type":690,"tag":842,"props":843,"children":844},"br",{},[],{"type":695,"value":846},"\nКоманда на установку может исходить от сервера (через ",{"type":690,"tag":714,"props":848,"children":850},{"className":849},[],[851],{"type":695,"value":727},{"type":695,"value":853},") или от JavaScript в документе (через setter ",{"type":690,"tag":714,"props":855,"children":857},{"className":856},[],[858],{"type":695,"value":719},{"type":695,"value":860}," или через ",{"type":690,"tag":714,"props":862,"children":864},{"className":863},[],[865],{"type":695,"value":767},{"type":695,"value":867},"), а фактическую операцию сохранения/обновления выполняет браузер (user agent), так как cookie store принадлежит браузеру и подчиняется его правилам.",{"data":869,"body":870},{},{"type":687,"children":871},[872],{"type":690,"tag":691,"props":873,"children":874},{},[875],{"type":695,"value":18},{"data":877,"body":878},{},{"type":687,"children":879},[880,897,902,914,927],{"type":690,"tag":691,"props":881,"children":882},{},[883,885,890,892,895],{"type":695,"value":884},"При установке cookie по HTTP инициатором команды является сервер: он отправляет в ответе заголовок ",{"type":690,"tag":714,"props":886,"children":888},{"className":887},[],[889],{"type":695,"value":727},{"type":695,"value":891},", предназначенный для передачи параметров cookie в браузер.",{"type":690,"tag":842,"props":893,"children":894},{},[],{"type":695,"value":896},"\nДалее браузер разбирает имя/значение и атрибуты, проверяет применимость и либо сохраняет cookie, либо отклоняет установку (например, из‑за требований безопасности и ограничений приватности).",{"type":690,"tag":691,"props":898,"children":899},{},[900],{"type":695,"value":901},"Примеры HTTP-ответа:",{"type":690,"tag":903,"props":904,"children":908},"pre",{"className":905,"code":907,"language":695},[906],"language-text","HTTP/1.1 200 OK\nContent-Type: text/html\nSet-Cookie: SID=abc123; Path=/; HttpOnly; Secure; SameSite=Lax\n\nHTTP/1.1 200 OK\nSet-Cookie: PREF=dark; Max-Age=31536000; Path=/; Secure; SameSite=None\n",[909],{"type":690,"tag":714,"props":910,"children":912},{"__ignoreMap":911},"",[913],{"type":695,"value":907},{"type":690,"tag":691,"props":915,"children":916},{},[917,919,925],{"type":695,"value":918},"Пример последующего запроса, где браузер сам добавляет заголовок ",{"type":690,"tag":714,"props":920,"children":922},{"className":921},[],[923],{"type":695,"value":924},"Cookie",{"type":695,"value":926}," с подходящими значениями:",{"type":690,"tag":903,"props":928,"children":931},{"className":929,"code":930,"language":695},[906],"GET /account HTTP/1.1\nHost: example.com\nCookie: SID=abc123; PREF=dark\n",[932],{"type":690,"tag":714,"props":933,"children":934},{"__ignoreMap":911},[935],{"type":695,"value":930},{"data":937,"body":938},{},{"type":687,"children":939},[940],{"type":690,"tag":691,"props":941,"children":942},{},[943,945,950,952,958,959,965],{"type":695,"value":944},"Наличие ",{"type":690,"tag":714,"props":946,"children":948},{"className":947},[],[949],{"type":695,"value":727},{"type":695,"value":951}," не означает гарантированную запись: часть cookie может блокироваться или модифицироваться (например, по атрибутам ",{"type":690,"tag":714,"props":953,"children":955},{"className":954},[],[956],{"type":695,"value":957},"SameSite",{"type":695,"value":761},{"type":690,"tag":714,"props":960,"children":962},{"className":961},[],[963],{"type":695,"value":964},"Secure",{"type":695,"value":966}," и по настройкам браузера).",{"data":968,"body":969},{},{"type":687,"children":970},[971,1011,1016,1025,1030,1039,1044],{"type":690,"tag":691,"props":972,"children":973},{},[974,976,981,983,986,988,994,996,1002,1004,1009],{"type":695,"value":975},"При установке cookie из JavaScript инициатором команды является код страницы, который присваивает строку в ",{"type":690,"tag":714,"props":977,"children":979},{"className":978},[],[980],{"type":695,"value":719},{"type":695,"value":982},", причём за одно присваивание задаётся одна cookie.",{"type":690,"tag":842,"props":984,"children":985},{},[],{"type":695,"value":987},"\nБраузер интерпретирует строку вида ",{"type":690,"tag":714,"props":989,"children":991},{"className":990},[],[992],{"type":695,"value":993},"key=value; attr=...",{"type":695,"value":995}," и применяет её к cookie текущего контекста с учётом области видимости (domain/path), срока жизни, а также ограничений доступа (например, cookie с ",{"type":690,"tag":714,"props":997,"children":999},{"className":998},[],[1000],{"type":695,"value":1001},"HttpOnly",{"type":695,"value":1003}," не читаются через ",{"type":690,"tag":714,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":695,"value":719},{"type":695,"value":1010},").",{"type":690,"tag":691,"props":1012,"children":1013},{},[1014],{"type":695,"value":1015},"Пример установки cookie:",{"type":690,"tag":903,"props":1017,"children":1020},{"className":1018,"code":1019,"language":695},[906],"document.cookie = \"theme=dark; Path=/; Max-Age=86400; SameSite=Lax\"\n",[1021],{"type":690,"tag":714,"props":1022,"children":1023},{"__ignoreMap":911},[1024],{"type":695,"value":1019},{"type":690,"tag":691,"props":1026,"children":1027},{},[1028],{"type":695,"value":1029},"Пример удаления cookie через истёкшую дату:",{"type":690,"tag":903,"props":1031,"children":1034},{"className":1032,"code":1033,"language":695},[906],"document.cookie = \"theme=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT\"\n",[1035],{"type":690,"tag":714,"props":1036,"children":1037},{"__ignoreMap":911},[1038],{"type":695,"value":1033},{"type":690,"tag":691,"props":1040,"children":1041},{},[1042],{"type":695,"value":1043},"Пример чтения cookie:",{"type":690,"tag":903,"props":1045,"children":1048},{"className":1046,"code":1047,"language":695},[906],"const cookieLine = document.cookie\n",[1049],{"type":690,"tag":714,"props":1050,"children":1051},{"__ignoreMap":911},[1052],{"type":695,"value":1047},{"data":1054,"body":1055},{},{"type":687,"children":1056},[1057],{"type":690,"tag":691,"props":1058,"children":1059},{},[1060,1062,1067,1069,1074,1076,1081,1083,1088],{"type":695,"value":1061},"Через ",{"type":690,"tag":714,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":695,"value":719},{"type":695,"value":1068}," не устанавливается ",{"type":690,"tag":714,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":695,"value":1001},{"type":695,"value":1075},", поэтому cookie, которые не должны быть доступны JavaScript (например, идентификатор сессии), обычно инициируются сервером через ",{"type":690,"tag":714,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":695,"value":727},{"type":695,"value":1082}," с ",{"type":690,"tag":714,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":695,"value":1001},{"type":695,"value":769},{"data":1090,"body":1091},{},{"type":687,"children":1092},[1093,1118,1123,1132,1137],{"type":690,"tag":691,"props":1094,"children":1095},{},[1096,1098,1101,1103,1108,1110,1116],{"type":695,"value":1097},"Cookie Store API предоставляет асинхронный интерфейс для установки cookie из документа или service worker: инициатором команды выступает скрипт, а запись выполняется браузером.",{"type":690,"tag":842,"props":1099,"children":1100},{},[],{"type":695,"value":1102},"\nОперация установки выполняется методом ",{"type":690,"tag":714,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":695,"value":767},{"type":695,"value":1109},", который обычно требует безопасного контекста и возвращает промис, поэтому типичный шаблон включает ",{"type":690,"tag":714,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":695,"value":1115},"await",{"type":695,"value":1117}," и обработку ошибок.",{"type":690,"tag":691,"props":1119,"children":1120},{},[1121],{"type":695,"value":1122},"Пример установки cookie по имени и значению:",{"type":690,"tag":903,"props":1124,"children":1127},{"className":1125,"code":1126,"language":695},[906],"await cookieStore.set(\"cookie1\", \"cookie1-value\")\n",[1128],{"type":690,"tag":714,"props":1129,"children":1130},{"__ignoreMap":911},[1131],{"type":695,"value":1126},{"type":690,"tag":691,"props":1133,"children":1134},{},[1135],{"type":695,"value":1136},"Пример установки cookie объектом:",{"type":690,"tag":903,"props":1138,"children":1141},{"className":1139,"code":1140,"language":695},[906],"async function cookieTest() {\n  const day = 24 * 60 * 60 * 1000;\n\n  try {\n    await cookieStore.set({\n      name: \"cookie2\",\n      value: \"cookie2-value\",\n      expires: Date.now() + day,\n      partitioned: true\n    });\n  } catch (error) {\n    console.log(`Error setting cookie2: ${error}`);\n  }\n}\n",[1142],{"type":690,"tag":714,"props":1143,"children":1144},{"__ignoreMap":911},[1145],{"type":695,"value":1140},{"data":1147,"body":1148},{},{"type":687,"children":1149},[1150],{"type":690,"tag":691,"props":1151,"children":1152},{},[1153],{"type":695,"value":49},{"data":1155,"body":1156},{},{"type":687,"children":1157},[1158,1180,1185,1335,1340],{"type":690,"tag":691,"props":1159,"children":1160},{},[1161,1163,1166,1168,1173,1175,1178],{"type":695,"value":1162},"Инициатор команды на установку cookie может быть внешним по отношению к браузеру (сервер) или внутренним (скрипт), но исполнитель сохранения — браузер (user agent), поскольку cookie являются механизмом состояния, управляемым клиентом.",{"type":690,"tag":842,"props":1164,"children":1165},{},[],{"type":695,"value":1167},"\nЭто разделение помогает объяснить поведение безопасности: ",{"type":690,"tag":714,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":695,"value":1001},{"type":695,"value":1174}," ограничивает доступ скриптов, но не отменяет автоматическую отправку cookie браузером в запросах при выполнении условий области видимости.",{"type":690,"tag":842,"props":1176,"children":1177},{},[],{"type":695,"value":1179},"\nТакже встречаются дополнительные источники команд (например, расширения браузера), однако даже в этих случаях физическое изменение cookie store выполняется браузером.",{"type":690,"tag":691,"props":1181,"children":1182},{},[1183],{"type":695,"value":1184},"Таблица ролей и каналов установки:",{"type":690,"tag":1186,"props":1187,"children":1188},"table",{},[1189,1218],{"type":690,"tag":1190,"props":1191,"children":1192},"thead",{},[1193],{"type":690,"tag":1194,"props":1195,"children":1196},"tr",{},[1197,1203,1208,1213],{"type":690,"tag":1198,"props":1199,"children":1200},"th",{},[1201],{"type":695,"value":1202},"Канал установки",{"type":690,"tag":1198,"props":1204,"children":1205},{},[1206],{"type":695,"value":1207},"Инициатор команды",{"type":690,"tag":1198,"props":1209,"children":1210},{},[1211],{"type":695,"value":1212},"Исполнитель записи",{"type":690,"tag":1198,"props":1214,"children":1215},{},[1216],{"type":695,"value":1217},"Типичный пример",{"type":690,"tag":1219,"props":1220,"children":1221},"tbody",{},[1222,1255,1284,1313],{"type":690,"tag":1194,"props":1223,"children":1224},{},[1225,1236,1241,1246],{"type":690,"tag":1226,"props":1227,"children":1228},"td",{},[1229,1231],{"type":695,"value":1230},"HTTP ",{"type":690,"tag":714,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":695,"value":727},{"type":690,"tag":1226,"props":1237,"children":1238},{},[1239],{"type":695,"value":1240},"Сервер",{"type":690,"tag":1226,"props":1242,"children":1243},{},[1244],{"type":695,"value":1245},"Браузер (user agent)",{"type":690,"tag":1226,"props":1247,"children":1248},{},[1249],{"type":690,"tag":714,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":695,"value":1254},"Set-Cookie: SID=...; HttpOnly; Secure",{"type":690,"tag":1194,"props":1256,"children":1257},{},[1258,1266,1271,1275],{"type":690,"tag":1226,"props":1259,"children":1260},{},[1261],{"type":690,"tag":714,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":695,"value":719},{"type":690,"tag":1226,"props":1267,"children":1268},{},[1269],{"type":695,"value":1270},"Скрипт страницы",{"type":690,"tag":1226,"props":1272,"children":1273},{},[1274],{"type":695,"value":1245},{"type":690,"tag":1226,"props":1276,"children":1277},{},[1278],{"type":690,"tag":714,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":695,"value":1283},"document.cookie = \"theme=dark; Path=/\"",{"type":690,"tag":1194,"props":1285,"children":1286},{},[1287,1295,1300,1304],{"type":690,"tag":1226,"props":1288,"children":1289},{},[1290],{"type":690,"tag":714,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":695,"value":767},{"type":690,"tag":1226,"props":1296,"children":1297},{},[1298],{"type":695,"value":1299},"Скрипт (страница/SW)",{"type":690,"tag":1226,"props":1301,"children":1302},{},[1303],{"type":695,"value":1245},{"type":690,"tag":1226,"props":1305,"children":1306},{},[1307],{"type":690,"tag":714,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":695,"value":1312},"await cookieStore.set(\"a\",\"b\")",{"type":690,"tag":1194,"props":1314,"children":1315},{},[1316,1321,1326,1330],{"type":690,"tag":1226,"props":1317,"children":1318},{},[1319],{"type":695,"value":1320},"API расширений",{"type":690,"tag":1226,"props":1322,"children":1323},{},[1324],{"type":695,"value":1325},"Расширение",{"type":690,"tag":1226,"props":1327,"children":1328},{},[1329],{"type":695,"value":1245},{"type":690,"tag":1226,"props":1331,"children":1332},{},[1333],{"type":695,"value":1334},"установка через API cookies",{"type":690,"tag":691,"props":1336,"children":1337},{},[1338],{"type":695,"value":1339},"Схема потоков (упрощённо):",{"type":690,"tag":903,"props":1341,"children":1344},{"className":1342,"code":1343,"language":695},[906],"server --(response: Set-Cookie)--> browser(cookie store)\njs -----(document.cookie / cookieStore.set)--> browser(cookie store)\nbrowser --(request: Cookie)--> server\n",[1345],{"type":690,"tag":714,"props":1346,"children":1347},{"__ignoreMap":911},[1348],{"type":695,"value":1343},{"data":1350,"body":1351},{},{"type":687,"children":1352},[1353],{"type":690,"tag":691,"props":1354,"children":1355},{},[1356,1358,1363,1365,1370,1371,1376],{"type":695,"value":1357},"Кратко: инициирование установки cookie возможно со стороны сервера (",{"type":690,"tag":714,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":695,"value":727},{"type":695,"value":1364},") и со стороны скрипта (",{"type":690,"tag":714,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":695,"value":719},{"type":695,"value":761},{"type":690,"tag":714,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":695,"value":767},{"type":695,"value":1377},"), но реальную запись и применение правил всегда выполняет браузер (user agent).",1775735659914]