[{"data":1,"prerenderedAt":1637},["ShallowReactive",2],{"$fyudgn3-vQ13Ea5ieDNtVzKNLhfzPmnZ0Do7u3PPnIxY":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":123,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":126,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":452,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":455,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":699,"mdc--jo1d1k-key":719,"mdc-szek5n-key":750,"mdc-ros7lm-key":767,"mdc--xqvqli-key":782,"mdc-26a7jv-key":797,"mdc--r4pw48-key":819,"mdc--txppjv-key":842,"mdc--tgkmoa-key":857,"mdc-xp4x54-key":942,"mdc--ee93ki-key":1009,"mdc-3gn705-key":1025,"mdc--3s9ygd-key":1105,"mdc--gilomz-key":1176,"mdc--9r3e6z-key":1199,"mdc--fksf1r-key":1246,"mdc-l4lmzr-key":1495,"mdc-4wk8w0-key":1521,"mdc--r09hgo-key":1539,"mdc--gnib67-key":1562,"mdc-q43868-key":1594},{"content":4,"quizQuestionContent":93,"type":112,"pageMeta":113},[5,9,13,16,20,24,28,31,35,38,42,45,48,52,55,59,62,66,70,73,77,80,83,87,90],{"id":6,"value":7,"isTypeH1":8},"1878","Выбор структуры данных для уникальных строк в JavaScript",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4278","Какую структуру выбрать","which-data-structure-to-choose",{"id":14,"value":15,"isTypeParagraph":8},"9855","Для хранения **уникальных** строк в JavaScript наиболее подходящей структурой является встроенный `Set`, потому что он по определению хранит только уникальные значения и предоставляет быстрые проверки наличия через `has()` и добавление через `add()`.  \nДля задачи вида `['a', 'b', 'a', 'c', 'b'] → {'a','b','c'}` структура `Set` лучше всего выражает смысл (“множество уникальных значений”) и обычно работает эффективнее, чем подход с `Array.prototype.includes()` при сопоставимом количестве элементов.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"610","Если в будущем потребуется не просто “уникальность”, а, например, “сколько раз встретилась строка”, структура для решения станет другой (обычно `Map` или объект-счётчик), потому что понадобится хранить значения-счётчики, а не только факт присутствия.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4279","Теория: что происходит при добавлении","how-uniqueness-is-ensured",{"id":25,"value":26,"anchor":27,"isTypeH3":8},"4300","Массив + `includes()`: линейный поиск","array-includes-linear-search",{"id":29,"value":30,"isTypeParagraph":8},"9856","Проверка `arr.includes(x)` выполняет последовательный просмотр элементов массива до совпадения или конца массива, то есть по смыслу это линейный поиск.  \nТакже `includes()` сравнивает значения по алгоритму SameValueZero (важно для `NaN` и для `-0`/`0`), но для строк это совпадает с ожидаемым сравнением по содержимому строки.\n\nТиповой алгоритм для уникальности на массиве:\n```\nconst input = ['a', 'b', 'a', 'c', 'b'];\nconst unique = [];\n\nfor (const s of input) {\n  if (!unique.includes(s)) {\n    unique.push(s);\n  }\n}\n```\n\nС точки зрения сложности: при каждом добавлении выполняется `includes()` по уже накопленному массиву, поэтому при росте данных суммарная работа часто становится квадратичной (примерно O(n^2) по числу элементов).  \nНа малых данных это может быть приемлемо, но при росте массива даже “простая” проверка начинает доминировать по времени.",{"id":32,"value":33,"anchor":34,"isTypeH3":8},"4301","`Set`: множество уникальных значений","set-a-set-of-unique-values",{"id":36,"value":37,"isTypeParagraph":8},"9857","`Set` хранит значения так, что одно и то же значение не может встречаться в наборе более одного раза, то есть повторное `add()` не увеличит набор.  \nСильная сторона `Set` — семантика: задача “оставить только уникальные элементы” напрямую соответствует структуре данных “множество”.\n\nВажное поведение, которое часто ожидается:\n- В `Set` можно итерировать элементы в порядке вставки (то есть в порядке первого появления уникальных элементов).\n- `Set.prototype.has()` обычно реализуется так, чтобы проверка наличия была эффективной на больших объёмах данных по сравнению с линейным поиском в массиве.\n\nТиповой алгоритм:\n\n```\nconst input = ['a', 'b', 'a', 'c', 'b'];\nconst uniqueSet = new Set(input);\n\nconst uniqueArray = [...uniqueSet]; // ['a','b','c']\n```",{"id":39,"value":40,"anchor":41,"isTypeH3":8},"4302","Объект как “словарь”: ключи-строки → `true`","object-as-a-dictionary-string-keys-true",{"id":43,"value":44,"isTypeParagraph":8},"9858","У обычного объекта ключи — это строки или символы, и это похоже на структуру “словарь”.  \nНо у объекта есть “унаследованные” свойства (из прототипа), поэтому при использовании пользовательских строк как ключей возможны конфликты с именами вроде `__proto__` или `constructor`, если не предпринять меры.\n\nЧтобы получить объект без прототипа, часто создаётся “чистый словарь” через `Object.create(null)`, и тогда ключи будут только теми, что явно добавлены (это уменьшает риск случайных ключей).\n\nВариант с обычным объектом (потенциально опаснее из-за прототипа):\n\n```\nconst input = ['a', 'b', 'a', 'c', 'b'];\nconst dict = {}; // есть прототип\n\nfor (const s of input) {\n  dict[s] = true;\n}\n```\n\nВариант безопаснее для “словаря”:\n\n```\nconst input = ['a', 'b', 'a', 'c', 'b'];\nconst dict = Object.create(null); // без прототипа\n\nfor (const s of input) {\n  dict[s] = true;\n}\n\nconst uniqueArray = Object.keys(dict); // порядок ключей — отдельная тема\n```",{"id":46,"description":47,"titleAlert":19,"isTypeAlertWarning":8},"665","У объекта есть отличия от `Map`: `Map` не содержит ключей “по умолчанию” и безопаснее с пользовательскими ключами, а объект может быть уязвим к нежелательным ключам при неосторожном использовании.",{"id":49,"value":50,"anchor":51,"isTypeH3":8},"4303","`Map`: ключи → `true`","map-keys-true",{"id":53,"value":54,"isTypeParagraph":8},"9859","`Map` хранит пары ключ-значение, ключи уникальны (один и тот же ключ не может встречаться дважды), а порядок обхода соответствует порядку вставки.  \nВ `Map` ключом может быть значение любого типа (включая объекты и функции), тогда как у объекта ключи ограничены строками и символами.\n\nПример “как множество” через `Map` (обычно избыточно):\n\n```\nconst input = ['a', 'b', 'a', 'c', 'b'];\nconst m = new Map();\n\nfor (const s of input) {\n  m.set(s, true);\n}\n\nconst uniqueArray = [...m.keys()]; // ['a','b','c']\n```",{"id":56,"value":57,"anchor":58,"isTypeH2":8},"4280","Сравнение вариантов","comparison-table",{"id":60,"value":61,"isTypeParagraph":8},"9860","| Вариант | Семантика (что означает структура) | Проверка наличия | Уникальность “по умолчанию” | Подводные камни |\n|---|---|---|---|---|\n| 1) Array + `includes()` | Список, где уникальность обеспечивается вручную | `includes()` просматривает элементы и сравнивает SameValueZero | Нет | При росте данных часто становится медленно из-за повторяющихся линейных проверок |\n| 2) `Set` | Множество уникальных значений | `has()` | Да: значение встречается не более одного раза | Иногда требуется конвертация в массив, если нужен именно массив |\n| 3) Object со значениями `true` | “Словарь” строк → булево значение | Проверка через чтение свойства, например `dict[s] === true` | Нет (уникальность поддерживается логикой записи по ключу) | Прототип и “случайные ключи”, безопаснее применять `Object.create(null)` |\n| 4) `Map` со значениями `true` | Словарь ключ → значение, ключ уникален | `has(key)` | Да (ключ встречается один раз) | Для задачи “только уникальные строки” обычно избыточен по смыслу, потому что `Set` выражает задачу точнее |\n\nМини-схема разницы подходов (идея работы):\n\nВариант 1 (Array):\n```\nэлемент -> includes(линейный поиск) -> если нет -> push\n```\n\nВариант 2 (Set):\n```\nэлемент -> add(встроенная уникальность) -> повтор “игнорируется”\n```",{"id":63,"value":64,"anchor":65,"isTypeH2":8},"4281","Практические решения","practical-solutions",{"id":67,"value":68,"anchor":69,"isTypeH3":8},"4304","Рекомендуемое (Set)","recommended-set",{"id":71,"value":72,"isTypeParagraph":8},"9861","Для получения уникальных строк из массива достаточно `const unique = [...new Set(list)]`, и порядок будет соответствовать первому появлению элементов во входном массиве (то есть сохраняется “порядок первых вхождений”).\n\n```\nconst list = ['a', 'b', 'a', 'c', 'b'];\nconst unique = [...new Set(list)];\n// unique: ['a', 'b', 'c']\n```",{"id":74,"value":75,"anchor":76,"isTypeH3":8},"4305","Если нужен быстрый “словарь” и простой формат (Object.create(null))","if-you-need-a-quick-dictionary-and-a-simple-format-object-create-null",{"id":78,"value":79,"isTypeParagraph":8},"9862","Объект может быть удобен, когда требуется сериализация в JSON или максимально простой формат “ключ → признак”, но безопаснее создавать объект без прототипа, чтобы уменьшить риск конфликтов по именам ключей.\n\n```\nconst list = ['a', 'b', 'a', 'c', 'b'];\n\nconst dict = Object.create(null);\nfor (const s of list) {\n  dict[s] = true;\n}\n\n// Проверка наличия\nconst hasA = dict['a'] === true;\n\n// Если нужны уникальные строки массивом\nconst unique = Object.keys(dict);\n```",{"id":81,"description":82,"titleAlert":19,"isTypeAlertWarning":8},"666","Если требуется хранить произвольные ключи (не только строки) или важна безопасная работа с пользовательскими ключами, то `Map` обычно предпочтительнее объекта, потому что `Map` не имеет “случайных” ключей по умолчанию и лучше подходит именно для динамического словаря.",{"id":84,"value":85,"anchor":86,"isTypeH3":8},"4306","Если потребуется расширение задачи (частоты)","if-you-need-to-expand-the-task-frequency",{"id":88,"value":89,"isTypeParagraph":8},"9863","Для подсчёта повторов естественнее перейти с `Set` на `Map`, потому что появляется значение-счётчик, а не только факт уникальности.\n\n```\nconst list = ['a', 'b', 'a', 'c', 'b'];\nconst counts = new Map();\n\nfor (const s of list) {\n  counts.set(s, (counts.get(s) ?? 0) + 1);\n}\n\n// counts.get('a') -> 2\n// counts.get('b') -> 2\n// counts.get('c') -> 1\n```",{"id":91,"value":92,"isTypeParagraph":8},"9864","Итого: для списка уникальных строк наиболее подходящим выбором является `Set`, потому что он хранит только уникальные значения и обеспечивает эффективные `has()`/`add()`; массив с `includes()` проще, но хуже масштабируется, объект и `Map` решают похожую задачу, но обычно менее уместны, если нужны только уникальные строки.",{"id":94,"options":95,"hint":109,"solution":110,"description":111},"1120",[96,100,103,106],{"id":97,"label":98,"isCorrect":99},"4608","Использовать массив с проверкой наличия через `includes()` перед каждым добавлением",false,{"id":101,"label":102,"isCorrect":8},"4609","Использовать встроенный объект `Set`",{"id":104,"label":105,"isCorrect":99},"4610","Использовать объект, где ключами будут строки, а значениями — `true`",{"id":107,"label":108,"isCorrect":99},"4611","Использовать `Map`, сохраняя строки как ключи, а в значениях хранить `true`","Следует сначала сформулировать, что именно требуется хранить: “только уникальные значения” или “ключи и связанные с ними данные”; для первого случая структура `Set` наиболее прямолинейно выражает смысл, а для второго случая чаще подходит `Map` или объект-словарь.","**Правильный вариант: 2** - Использовать встроенный объект Set, так как он семантически соответствует задаче хранения уникальных значений, автоматически устраняет дубликаты и обеспечивает максимальную производительность операций добавления и проверки наличия элементов.","Есть список строк:\n\n```\n'a', 'b', 'a', 'c', 'b'\n```\n\nКакую структуру данных выбрать для  хранения списка уникальных строк?","quizQuestion",{"title":114,"description":115,"ogTitle":7,"ogDescription":115,"ogImageUrl":116,"canonical":19,"ogLocale":117,"ogSiteName":118,"ogImageType":119,"ogImageWidth":120,"ogImageHeight":121,"ogType":122,"ogUrl":19},"Структура данных для хранения списка уникальных строк","Разбор Array+includes, Set, Object и Map: сложность, подводные камни, примеры кода и итоговый выбор.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":124,"siteUrl":125},"GOOD WEB JOB!","https://goodwebjob.ru",{"slugs":127},[128,131,134,137,140,143,146,149,152,155,158,161,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,302,305,308,311,314,317,320,323,326,329,332,335,338,341,344,347,350,353,356,359,362,365,368,371,374,377,380,383,386,389,392,395,398,401,404,407,410,413,416,419,422,425,428,431,434,437,440,443,446,449],{"name":129,"value":130},"Теоретические задания","theoretical-tasks",{"name":132,"value":133},"Что вернёт этот код: typeof (function(){})()","what-this-code-will-return-typeof-function",{"name":135,"value":136},"С чего начать?","where-to-begin",{"name":138,"value":139},"Почему опасно писать прямо в прототипы базовых типов?","why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":141,"value":142},"Backend","backend",{"name":144,"value":145},"Frontend","frontend",{"name":147,"value":148},"Какие логические значения в console.log будут получены?","prototype-what-logical-values-will-be-received-in-console-log",{"name":150,"value":151},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":153,"value":154}," Найти в массиве неповторяющиеся числа","find-non-repeating-numbers-in-an-array",{"name":156,"value":157},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":159,"value":160},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":162,"value":163},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":165,"value":166},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":168,"value":169},"Какое значение выведет консоль с object.property?","what-value-will-the-console-output-with-object-property",{"name":171,"value":172},"Что выведется в console.log([arr[0](), arr[0]()])?","what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":174,"value":175},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","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":177,"value":178},"Необходимо проверить, являются ли две строки анаграммами друг друга","checks-whether-two-strings-are-anagrams-of-each-other",{"name":180,"value":181},"Определить, является ли слово палиндромом","determines-whether-a-word-is-a-palindrome",{"name":183,"value":184},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":186,"value":187},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":189,"value":190},"Дано дерево (вложенный объект), надо найти сумму всех вершин","given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":192,"value":193},"Для каждой ветви дерева записать номер вложенности данной ветви","for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":195,"value":196},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":198,"value":199},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","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":201,"value":202},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":204,"value":205},"Напишите функцию, который сделает из массива объект","write-a-function-that-will-make-an-object-out-of-an-array",{"name":207,"value":208},"Что выведет console.log в результате выполнения цикла while?","what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":210,"value":211},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","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":213,"value":214},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":216,"value":217},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":219,"value":220},"Уникализация значений в массиве","unifying-values-in-an-array",{"name":222,"value":223},"«Расплющивание» массива","flattening-the-array",{"name":225,"value":226},"Что вернёт метод book.getUpperName()?","what-will-the-book-get-upper-name-method-return",{"name":228,"value":229},"Сжатие строк","string-compression",{"name":231,"value":232},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":234,"value":235},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":237,"value":238},"Как браузер после ввода домена понимает, откуда брать сайт?","how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":240,"value":241},"Как домен попадает в DNS в таблицу соответствия: домен – ip","how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":243,"value":244},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":246,"value":247},"Ключевые отличия TCP и UDP","key-differences-between-tcp-and-udp",{"name":249,"value":250},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":252,"value":253},"Что такое HTTP и из чего состоит?","what-is-http-and-what-does-it-consist-of",{"name":255,"value":256},"Что такое заголовки в HTTP и зачем они нужны?","what-are-http-headers-and-why-do-we-need-them",{"name":258,"value":259},"Что такое параметры в HTTP?","what-are-http-parameters",{"name":261,"value":262},"Где находится HTML-код в структуре HTTP-ответа?","where-is-the-html-code-located-in-the-http-response-structure",{"name":264,"value":265},"Что такое HTML?","what-is-html",{"name":267,"value":268},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":270,"value":271},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","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":273,"value":274},"Что такое cookie?","what-is-a-cookie",{"name":276,"value":277},"Кто является инициатором записи cookie в браузере?","who-initiates-the-cookie-recording-in-the-browser",{"name":279,"value":280},"Есть ли возможность с клиента (с браузера) управлять cookie?","is-it-possible-to-manage-cookies-from-the-client-browser",{"name":282,"value":283},"Лайвкодинг","livecoding",{"name":285,"value":286},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":288,"value":289},"Всё, что идет по HTTPS – оно защищено?","is-everything-that-goes-through-https-secure",{"name":291,"value":292},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","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":294,"value":295},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","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":297,"value":298},"Как браузер парсит JavaScript и изображения при рендеринге?","how-the-browser-parses-javascript-and-images-when-rendering",{"name":300,"value":301},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":303,"value":304},"Что в браузере блокирует рендеринг страницы?","what-is-blocking-the-page-rendering-in-the-browser",{"name":306,"value":307},"Что такое DOM в браузере? Что такое CSSOM?","what-is-dom-in-a-browser-what-is-cssom",{"name":309,"value":310},"Что является узлами в DOM?","what-are-nodes-in-the-dom",{"name":312,"value":313},"Из чего состоит CSSOM?","what-does-cssom-consist-of",{"name":315,"value":316},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":318,"value":319},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":321,"value":322},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":324,"value":325},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":327,"value":328},"Есть HTML код. Будет ли font-weight на span влиять?","there-is-an-html-code-will-font-weight-affect-span",{"name":330,"value":331},"Flexbox и Grid, чем отличаются друг от друга?","what-are-the-differences-between-flexbox-and-grid",{"name":333,"value":334},"Заменяют ли Flexbox и Grid друг друга?","do-flexbox-and-grid-replace-each-other",{"name":336,"value":337},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":339,"value":340},"Сборник задач","tasks",{"name":342,"value":343},"Какие способы объявления функции есть в JavaScript?","what-are-the-ways-to-declare-a-function-in-javascript",{"name":345,"value":346},"Что такое this в JavaScript?","what-is-this-in-javascript",{"name":348,"value":349},"Что такое Event Loop, как работает?","what-is-an-event-loop-and-how-does-it-work",{"name":351,"value":352},"Что будет, если вызвать typeof на необъявленной переменной?","what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":354,"value":355},"Что показывает оператор typeof в JavaScript?","what-does-the-typeof-operator-show-in-javascript",{"name":357,"value":358},"Какие типы данных существует в JavaScript?","what-types-of-data-exist-in-javascript",{"name":360,"value":361},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":363,"value":364},"Что вернет typeof для массива?","what-will-typeof-return-for-an-array",{"name":366,"value":367},"Почему оператор typeof, применённый к массиву, возвращает объект?","why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":369,"value":370},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":372,"value":373},"Что возвращает typeof для new Set в JavaScript?","what-does-typeof-return-for-new-set-in-javascript",{"name":375,"value":376},"Для чего нужен React, какие он решает проблемы?","what-is-react-used-for-and-what-problems-does-it-solve",{"name":378,"value":379},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":381,"value":382},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":384,"value":385},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","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":387,"value":388},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":390,"value":391},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","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":393,"value":394},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","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":396,"value":397},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":399,"value":400},"Какие существуют стратегии ветвления для работы команды? Что это такое?","what-are-the-branching-strategies-for-the-team-what-is-it",{"name":402,"value":403},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":405,"value":406},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":408,"value":409},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":411,"value":412},"Что такое алгоритмическая сложность?","what-is-algorithmic-complexity",{"name":414,"value":415},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","what-is-the-algorithmic-complexity-of-quick-sort",{"name":417,"value":418},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":420,"value":421},"Каким способом может выполняться авторизация пользователя на сайте?","how-can-a-user-be-authorized-on-a-website",{"name":423,"value":424},"В чем разница между микро- и макро-тасками в JavaScript?","what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":426,"value":427},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","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":429,"value":430},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","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":432,"value":433},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":435,"value":436},"Подготовка к тех.интервью","technical-interview",{"name":438,"value":439},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","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":441,"value":442},"Что такое DNS, как DNS находит нужный IP-адрес?","what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":444,"value":445},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","variables-are-declared-as-follows-specify-the-correct-statement",{"name":447,"value":448},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":450,"value":451},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","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",[453],{"label":435,"slug":436,"to":454},"/technical-interview/where-to-begin",{"navigationList":456,"navigationSublist":462},[457,459],{"path":454,"isActive":99,"name":135,"icon":458,"isNavbarMobileDisabled":8},"material-symbols:visibility-outline-rounded",{"path":460,"isActive":8,"name":339,"icon":461,"isNavbarMobileDisabled":99},"/technical-interview/tasks","material-symbols:task-outline",[463,470,489,498,503,598,615,622,627,670,685,690],{"title":464,"list":465,"isOpened":99},"Bash",[466,468],{"name":405,"path":467,"isActive":99},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":408,"path":469,"isActive":99},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":471,"list":472,"isOpened":99},"CSS",[473,475,477,479,481,483,485,487],{"name":315,"path":474,"isActive":99},"/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":318,"path":476,"isActive":99},"/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":321,"path":478,"isActive":99},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":324,"path":480,"isActive":99},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":327,"path":482,"isActive":99},"/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":330,"path":484,"isActive":99},"/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":333,"path":486,"isActive":99},"/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":336,"path":488,"isActive":99},"/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":490,"list":491,"isOpened":99},"Git",[492,494,496],{"name":393,"path":493,"isActive":99},"/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":396,"path":495,"isActive":99},"/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":399,"path":497,"isActive":99},"/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":499,"list":500,"isOpened":99},"HTML",[501],{"name":264,"path":502,"isActive":99},"/technical-interview/tasks/what-is-html",{"title":504,"list":505,"isOpened":99},"JavaScript",[506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596],{"name":147,"path":507,"isActive":99},"/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":138,"path":509,"isActive":99},"/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":285,"path":511,"isActive":99},"/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":168,"path":513,"isActive":99},"/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":171,"path":515,"isActive":99},"/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":207,"path":517,"isActive":99},"/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":210,"path":519,"isActive":99},"/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":225,"path":521,"isActive":99},"/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":444,"path":523,"isActive":99},"/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":231,"path":525,"isActive":99},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":213,"path":527,"isActive":99},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":216,"path":529,"isActive":99},"/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":132,"path":531,"isActive":99},"/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":234,"path":533,"isActive":99},"/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":342,"path":535,"isActive":99},"/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":345,"path":537,"isActive":99},"/technical-interview/tasks/what-is-this-in-javascript",{"name":348,"path":539,"isActive":99},"/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":351,"path":541,"isActive":99},"/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":354,"path":543,"isActive":99},"/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":357,"path":545,"isActive":99},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":360,"path":547,"isActive":99},"/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":363,"path":549,"isActive":99},"/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":366,"path":551,"isActive":99},"/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":369,"path":553,"isActive":99},"/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":372,"path":555,"isActive":99},"/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":417,"path":557,"isActive":99},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":423,"path":559,"isActive":99},"/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":156,"path":561,"isActive":99},"/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":174,"path":563,"isActive":99},"/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":159,"path":565,"isActive":99},"/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":189,"path":567,"isActive":99},"/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":165,"path":569,"isActive":99},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":192,"path":571,"isActive":99},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":183,"path":573,"isActive":99},"/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":195,"path":575,"isActive":99},"/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":201,"path":577,"isActive":99},"/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":153,"path":579,"isActive":99},"/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":204,"path":581,"isActive":99},"/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":177,"path":583,"isActive":99},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":150,"path":585,"isActive":99},"/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":180,"path":587,"isActive":99},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":222,"path":589,"isActive":99},"/technical-interview/tasks/flattening-the-array",{"name":186,"path":591,"isActive":99},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":228,"path":593,"isActive":99},"/technical-interview/tasks/string-compression",{"name":219,"path":595,"isActive":99},"/technical-interview/tasks/unifying-values-in-an-array",{"name":198,"path":597,"isActive":99},"/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":599,"list":600,"isOpened":99},"React",[601,603,605,607,609,611,613],{"name":375,"path":602,"isActive":99},"/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":447,"path":604,"isActive":99},"/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":378,"path":606,"isActive":99},"/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":381,"path":608,"isActive":99},"/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":384,"path":610,"isActive":99},"/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":387,"path":612,"isActive":99},"/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":450,"path":614,"isActive":99},"/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":616,"list":617,"isOpened":99},"Алгоритмы",[618,620],{"name":411,"path":619,"isActive":99},"/technical-interview/tasks/what-is-algorithmic-complexity",{"name":414,"path":621,"isActive":99},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":623,"list":624,"isOpened":99},"Дебаггинг",[625],{"name":390,"path":626,"isActive":99},"/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":628,"list":629,"isOpened":99},"Компьютерные сети",[630,632,634,636,638,640,642,644,646,648,650,652,654,656,658,660,662,664,666,668],{"name":237,"path":631,"isActive":99},"/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":441,"path":633,"isActive":99},"/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":240,"path":635,"isActive":99},"/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":243,"path":637,"isActive":99},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":246,"path":639,"isActive":99},"/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":249,"path":641,"isActive":99},"/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":252,"path":643,"isActive":99},"/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":255,"path":645,"isActive":99},"/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":258,"path":647,"isActive":99},"/technical-interview/tasks/what-are-http-parameters",{"name":261,"path":649,"isActive":99},"/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":267,"path":651,"isActive":99},"/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":270,"path":653,"isActive":99},"/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":273,"path":655,"isActive":99},"/technical-interview/tasks/what-is-a-cookie",{"name":276,"path":657,"isActive":99},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":279,"path":659,"isActive":99},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":438,"path":661,"isActive":99},"/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":288,"path":663,"isActive":99},"/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":291,"path":665,"isActive":99},"/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":294,"path":667,"isActive":99},"/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":420,"path":669,"isActive":99},"/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":671,"list":672,"isOpened":99},"Отрисовка в браузере",[673,675,677,679,681,683],{"name":300,"path":674,"isActive":99},"/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":297,"path":676,"isActive":99},"/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":303,"path":678,"isActive":99},"/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":306,"path":680,"isActive":99},"/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":309,"path":682,"isActive":99},"/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":312,"path":684,"isActive":99},"/technical-interview/tasks/what-does-cssom-consist-of",{"title":686,"list":687,"isOpened":99},"Ревью кода",[688],{"name":402,"path":689,"isActive":99},"/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":691,"list":692,"isOpened":99},"Теория вероятности",[693,695,697],{"name":426,"path":694,"isActive":99},"/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":429,"path":696,"isActive":99},"/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":432,"path":698,"isActive":99},"/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",{"cooperation":700,"copyright":703,"reportError":704,"socialNetwork":706},{"link":701,"title":702},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":705,"link":701},"Сообщить об ошибке",{"label":707,"socialNetworkList":708},"Мы в соцсетях:",[709,712,715],{"icon":19,"link":710,"title":711},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":713,"link":701,"title":714},"ic:baseline-telegram","Telegram",{"icon":716,"link":717,"title":718},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":720,"body":721},{},{"type":722,"children":723},"root",[724,732,745],{"type":725,"tag":726,"props":727,"children":728},"element","p",{},[729],{"type":730,"value":731},"text","Есть список строк:",{"type":725,"tag":733,"props":734,"children":738},"pre",{"className":735,"code":737,"language":730},[736],"language-text","'a', 'b', 'a', 'c', 'b'\n",[739],{"type":725,"tag":740,"props":741,"children":743},"code",{"__ignoreMap":742},"",[744],{"type":730,"value":737},{"type":725,"tag":726,"props":746,"children":747},{},[748],{"type":730,"value":749},"Какую структуру данных выбрать для  хранения списка уникальных строк?",{"data":751,"body":752},{},{"type":722,"children":753},[754],{"type":725,"tag":726,"props":755,"children":756},{},[757,759,765],{"type":730,"value":758},"Использовать массив с проверкой наличия через ",{"type":725,"tag":740,"props":760,"children":762},{"className":761},[],[763],{"type":730,"value":764},"includes()",{"type":730,"value":766}," перед каждым добавлением",{"data":768,"body":769},{},{"type":722,"children":770},[771],{"type":725,"tag":726,"props":772,"children":773},{},[774,776],{"type":730,"value":775},"Использовать встроенный объект ",{"type":725,"tag":740,"props":777,"children":779},{"className":778},[],[780],{"type":730,"value":781},"Set",{"data":783,"body":784},{},{"type":722,"children":785},[786],{"type":725,"tag":726,"props":787,"children":788},{},[789,791],{"type":730,"value":790},"Использовать объект, где ключами будут строки, а значениями — ",{"type":725,"tag":740,"props":792,"children":794},{"className":793},[],[795],{"type":730,"value":796},"true",{"data":798,"body":799},{},{"type":722,"children":800},[801],{"type":725,"tag":726,"props":802,"children":803},{},[804,806,812,814],{"type":730,"value":805},"Использовать ",{"type":725,"tag":740,"props":807,"children":809},{"className":808},[],[810],{"type":730,"value":811},"Map",{"type":730,"value":813},", сохраняя строки как ключи, а в значениях хранить ",{"type":725,"tag":740,"props":815,"children":817},{"className":816},[],[818],{"type":730,"value":796},{"data":820,"body":821},{},{"type":722,"children":822},[823],{"type":725,"tag":726,"props":824,"children":825},{},[826,828,833,835,840],{"type":730,"value":827},"Следует сначала сформулировать, что именно требуется хранить: “только уникальные значения” или “ключи и связанные с ними данные”; для первого случая структура ",{"type":725,"tag":740,"props":829,"children":831},{"className":830},[],[832],{"type":730,"value":781},{"type":730,"value":834}," наиболее прямолинейно выражает смысл, а для второго случая чаще подходит ",{"type":725,"tag":740,"props":836,"children":838},{"className":837},[],[839],{"type":730,"value":811},{"type":730,"value":841}," или объект-словарь.",{"data":843,"body":844},{},{"type":722,"children":845},[846],{"type":725,"tag":726,"props":847,"children":848},{},[849,855],{"type":725,"tag":850,"props":851,"children":852},"strong",{},[853],{"type":730,"value":854},"Правильный вариант: 2",{"type":730,"value":856}," - Использовать встроенный объект Set, так как он семантически соответствует задаче хранения уникальных значений, автоматически устраняет дубликаты и обеспечивает максимальную производительность операций добавления и проверки наличия элементов.",{"data":858,"body":859},{},{"type":722,"children":860},[861,911,916,925],{"type":725,"tag":726,"props":862,"children":863},{},[864,866,872,874,878,880,885,887,893,895,901,903,909],{"type":730,"value":865},"Проверка ",{"type":725,"tag":740,"props":867,"children":869},{"className":868},[],[870],{"type":730,"value":871},"arr.includes(x)",{"type":730,"value":873}," выполняет последовательный просмотр элементов массива до совпадения или конца массива, то есть по смыслу это линейный поиск.",{"type":725,"tag":875,"props":876,"children":877},"br",{},[],{"type":730,"value":879},"\nТакже ",{"type":725,"tag":740,"props":881,"children":883},{"className":882},[],[884],{"type":730,"value":764},{"type":730,"value":886}," сравнивает значения по алгоритму SameValueZero (важно для ",{"type":725,"tag":740,"props":888,"children":890},{"className":889},[],[891],{"type":730,"value":892},"NaN",{"type":730,"value":894}," и для ",{"type":725,"tag":740,"props":896,"children":898},{"className":897},[],[899],{"type":730,"value":900},"-0",{"type":730,"value":902},"/",{"type":725,"tag":740,"props":904,"children":906},{"className":905},[],[907],{"type":730,"value":908},"0",{"type":730,"value":910},"), но для строк это совпадает с ожидаемым сравнением по содержимому строки.",{"type":725,"tag":726,"props":912,"children":913},{},[914],{"type":730,"value":915},"Типовой алгоритм для уникальности на массиве:",{"type":725,"tag":733,"props":917,"children":920},{"className":918,"code":919,"language":730},[736],"const input = ['a', 'b', 'a', 'c', 'b'];\nconst unique = [];\n\nfor (const s of input) {\n  if (!unique.includes(s)) {\n    unique.push(s);\n  }\n}\n",[921],{"type":725,"tag":740,"props":922,"children":923},{"__ignoreMap":742},[924],{"type":730,"value":919},{"type":725,"tag":726,"props":926,"children":927},{},[928,930,935,937,940],{"type":730,"value":929},"С точки зрения сложности: при каждом добавлении выполняется ",{"type":725,"tag":740,"props":931,"children":933},{"className":932},[],[934],{"type":730,"value":764},{"type":730,"value":936}," по уже накопленному массиву, поэтому при росте данных суммарная работа часто становится квадратичной (примерно O(n^2) по числу элементов).",{"type":725,"tag":875,"props":938,"children":939},{},[],{"type":730,"value":941},"\nНа малых данных это может быть приемлемо, но при росте массива даже “простая” проверка начинает доминировать по времени.",{"data":943,"body":944},{},{"type":722,"children":945},[946],{"type":725,"tag":726,"props":947,"children":948},{},[949,951,956,958,963,965,971,973,979,981,984,986,992,994,999,1001,1007],{"type":730,"value":950},"Для хранения ",{"type":725,"tag":850,"props":952,"children":953},{},[954],{"type":730,"value":955},"уникальных",{"type":730,"value":957}," строк в JavaScript наиболее подходящей структурой является встроенный ",{"type":725,"tag":740,"props":959,"children":961},{"className":960},[],[962],{"type":730,"value":781},{"type":730,"value":964},", потому что он по определению хранит только уникальные значения и предоставляет быстрые проверки наличия через ",{"type":725,"tag":740,"props":966,"children":968},{"className":967},[],[969],{"type":730,"value":970},"has()",{"type":730,"value":972}," и добавление через ",{"type":725,"tag":740,"props":974,"children":976},{"className":975},[],[977],{"type":730,"value":978},"add()",{"type":730,"value":980},".",{"type":725,"tag":875,"props":982,"children":983},{},[],{"type":730,"value":985},"\nДля задачи вида ",{"type":725,"tag":740,"props":987,"children":989},{"className":988},[],[990],{"type":730,"value":991},"['a', 'b', 'a', 'c', 'b'] → {'a','b','c'}",{"type":730,"value":993}," структура ",{"type":725,"tag":740,"props":995,"children":997},{"className":996},[],[998],{"type":730,"value":781},{"type":730,"value":1000}," лучше всего выражает смысл (“множество уникальных значений”) и обычно работает эффективнее, чем подход с ",{"type":725,"tag":740,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":730,"value":1006},"Array.prototype.includes()",{"type":730,"value":1008}," при сопоставимом количестве элементов.",{"data":1010,"body":1011},{},{"type":722,"children":1012},[1013],{"type":725,"tag":726,"props":1014,"children":1015},{},[1016,1018,1023],{"type":730,"value":1017},"Если в будущем потребуется не просто “уникальность”, а, например, “сколько раз встретилась строка”, структура для решения станет другой (обычно ",{"type":725,"tag":740,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":730,"value":811},{"type":730,"value":1024}," или объект-счётчик), потому что понадобится хранить значения-счётчики, а не только факт присутствия.",{"data":1026,"body":1027},{},{"type":722,"children":1028},[1029,1058,1063,1091,1096],{"type":725,"tag":726,"props":1030,"children":1031},{},[1032,1037,1039,1044,1046,1049,1051,1056],{"type":725,"tag":740,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":730,"value":781},{"type":730,"value":1038}," хранит значения так, что одно и то же значение не может встречаться в наборе более одного раза, то есть повторное ",{"type":725,"tag":740,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":730,"value":978},{"type":730,"value":1045}," не увеличит набор.",{"type":725,"tag":875,"props":1047,"children":1048},{},[],{"type":730,"value":1050},"\nСильная сторона ",{"type":725,"tag":740,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":730,"value":781},{"type":730,"value":1057}," — семантика: задача “оставить только уникальные элементы” напрямую соответствует структуре данных “множество”.",{"type":725,"tag":726,"props":1059,"children":1060},{},[1061],{"type":730,"value":1062},"Важное поведение, которое часто ожидается:",{"type":725,"tag":1064,"props":1065,"children":1066},"ul",{},[1067,1080],{"type":725,"tag":1068,"props":1069,"children":1070},"li",{},[1071,1073,1078],{"type":730,"value":1072},"В ",{"type":725,"tag":740,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":730,"value":781},{"type":730,"value":1079}," можно итерировать элементы в порядке вставки (то есть в порядке первого появления уникальных элементов).",{"type":725,"tag":1068,"props":1081,"children":1082},{},[1083,1089],{"type":725,"tag":740,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":730,"value":1088},"Set.prototype.has()",{"type":730,"value":1090}," обычно реализуется так, чтобы проверка наличия была эффективной на больших объёмах данных по сравнению с линейным поиском в массиве.",{"type":725,"tag":726,"props":1092,"children":1093},{},[1094],{"type":730,"value":1095},"Типовой алгоритм:",{"type":725,"tag":733,"props":1097,"children":1100},{"className":1098,"code":1099,"language":730},[736],"const input = ['a', 'b', 'a', 'c', 'b'];\nconst uniqueSet = new Set(input);\n\nconst uniqueArray = [...uniqueSet]; // ['a','b','c']\n",[1101],{"type":725,"tag":740,"props":1102,"children":1103},{"__ignoreMap":742},[1104],{"type":730,"value":1099},{"data":1106,"body":1107},{},{"type":722,"children":1108},[1109,1135,1148,1153,1162,1167],{"type":725,"tag":726,"props":1110,"children":1111},{},[1112,1114,1117,1119,1125,1127,1133],{"type":730,"value":1113},"У обычного объекта ключи — это строки или символы, и это похоже на структуру “словарь”.",{"type":725,"tag":875,"props":1115,"children":1116},{},[],{"type":730,"value":1118},"\nНо у объекта есть “унаследованные” свойства (из прототипа), поэтому при использовании пользовательских строк как ключей возможны конфликты с именами вроде ",{"type":725,"tag":740,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":730,"value":1124},"__proto__",{"type":730,"value":1126}," или ",{"type":725,"tag":740,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":730,"value":1132},"constructor",{"type":730,"value":1134},", если не предпринять меры.",{"type":725,"tag":726,"props":1136,"children":1137},{},[1138,1140,1146],{"type":730,"value":1139},"Чтобы получить объект без прототипа, часто создаётся “чистый словарь” через ",{"type":725,"tag":740,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":730,"value":1145},"Object.create(null)",{"type":730,"value":1147},", и тогда ключи будут только теми, что явно добавлены (это уменьшает риск случайных ключей).",{"type":725,"tag":726,"props":1149,"children":1150},{},[1151],{"type":730,"value":1152},"Вариант с обычным объектом (потенциально опаснее из-за прототипа):",{"type":725,"tag":733,"props":1154,"children":1157},{"className":1155,"code":1156,"language":730},[736],"const input = ['a', 'b', 'a', 'c', 'b'];\nconst dict = {}; // есть прототип\n\nfor (const s of input) {\n  dict[s] = true;\n}\n",[1158],{"type":725,"tag":740,"props":1159,"children":1160},{"__ignoreMap":742},[1161],{"type":730,"value":1156},{"type":725,"tag":726,"props":1163,"children":1164},{},[1165],{"type":730,"value":1166},"Вариант безопаснее для “словаря”:",{"type":725,"tag":733,"props":1168,"children":1171},{"className":1169,"code":1170,"language":730},[736],"const input = ['a', 'b', 'a', 'c', 'b'];\nconst dict = Object.create(null); // без прототипа\n\nfor (const s of input) {\n  dict[s] = true;\n}\n\nconst uniqueArray = Object.keys(dict); // порядок ключей — отдельная тема\n",[1172],{"type":725,"tag":740,"props":1173,"children":1174},{"__ignoreMap":742},[1175],{"type":730,"value":1170},{"data":1177,"body":1178},{},{"type":722,"children":1179},[1180],{"type":725,"tag":726,"props":1181,"children":1182},{},[1183,1185,1190,1192,1197],{"type":730,"value":1184},"У объекта есть отличия от ",{"type":725,"tag":740,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":730,"value":811},{"type":730,"value":1191},": ",{"type":725,"tag":740,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":730,"value":811},{"type":730,"value":1198}," не содержит ключей “по умолчанию” и безопаснее с пользовательскими ключами, а объект может быть уязвим к нежелательным ключам при неосторожном использовании.",{"data":1200,"body":1201},{},{"type":722,"children":1202},[1203,1225,1237],{"type":725,"tag":726,"props":1204,"children":1205},{},[1206,1211,1213,1216,1218,1223],{"type":725,"tag":740,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":730,"value":811},{"type":730,"value":1212}," хранит пары ключ-значение, ключи уникальны (один и тот же ключ не может встречаться дважды), а порядок обхода соответствует порядку вставки.",{"type":725,"tag":875,"props":1214,"children":1215},{},[],{"type":730,"value":1217},"\nВ ",{"type":725,"tag":740,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":730,"value":811},{"type":730,"value":1224}," ключом может быть значение любого типа (включая объекты и функции), тогда как у объекта ключи ограничены строками и символами.",{"type":725,"tag":726,"props":1226,"children":1227},{},[1228,1230,1235],{"type":730,"value":1229},"Пример “как множество” через ",{"type":725,"tag":740,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":730,"value":811},{"type":730,"value":1236}," (обычно избыточно):",{"type":725,"tag":733,"props":1238,"children":1241},{"className":1239,"code":1240,"language":730},[736],"const input = ['a', 'b', 'a', 'c', 'b'];\nconst m = new Map();\n\nfor (const s of input) {\n  m.set(s, true);\n}\n\nconst uniqueArray = [...m.keys()]; // ['a','b','c']\n",[1242],{"type":725,"tag":740,"props":1243,"children":1244},{"__ignoreMap":742},[1245],{"type":730,"value":1240},{"data":1247,"body":1248},{},{"type":722,"children":1249},[1250,1462,1467,1472,1481,1486],{"type":725,"tag":1251,"props":1252,"children":1253},"table",{},[1254,1288],{"type":725,"tag":1255,"props":1256,"children":1257},"thead",{},[1258],{"type":725,"tag":1259,"props":1260,"children":1261},"tr",{},[1262,1268,1273,1278,1283],{"type":725,"tag":1263,"props":1264,"children":1265},"th",{},[1266],{"type":730,"value":1267},"Вариант",{"type":725,"tag":1263,"props":1269,"children":1270},{},[1271],{"type":730,"value":1272},"Семантика (что означает структура)",{"type":725,"tag":1263,"props":1274,"children":1275},{},[1276],{"type":730,"value":1277},"Проверка наличия",{"type":725,"tag":1263,"props":1279,"children":1280},{},[1281],{"type":730,"value":1282},"Уникальность “по умолчанию”",{"type":725,"tag":1263,"props":1284,"children":1285},{},[1286],{"type":730,"value":1287},"Подводные камни",{"type":725,"tag":1289,"props":1290,"children":1291},"tbody",{},[1292,1331,1367,1411],{"type":725,"tag":1259,"props":1293,"children":1294},{},[1295,1306,1311,1321,1326],{"type":725,"tag":1296,"props":1297,"children":1298},"td",{},[1299,1301],{"type":730,"value":1300},"1) Array + ",{"type":725,"tag":740,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":730,"value":764},{"type":725,"tag":1296,"props":1307,"children":1308},{},[1309],{"type":730,"value":1310},"Список, где уникальность обеспечивается вручную",{"type":725,"tag":1296,"props":1312,"children":1313},{},[1314,1319],{"type":725,"tag":740,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":730,"value":764},{"type":730,"value":1320}," просматривает элементы и сравнивает SameValueZero",{"type":725,"tag":1296,"props":1322,"children":1323},{},[1324],{"type":730,"value":1325},"Нет",{"type":725,"tag":1296,"props":1327,"children":1328},{},[1329],{"type":730,"value":1330},"При росте данных часто становится медленно из-за повторяющихся линейных проверок",{"type":725,"tag":1259,"props":1332,"children":1333},{},[1334,1344,1349,1357,1362],{"type":725,"tag":1296,"props":1335,"children":1336},{},[1337,1339],{"type":730,"value":1338},"2) ",{"type":725,"tag":740,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":730,"value":781},{"type":725,"tag":1296,"props":1345,"children":1346},{},[1347],{"type":730,"value":1348},"Множество уникальных значений",{"type":725,"tag":1296,"props":1350,"children":1351},{},[1352],{"type":725,"tag":740,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":730,"value":970},{"type":725,"tag":1296,"props":1358,"children":1359},{},[1360],{"type":730,"value":1361},"Да: значение встречается не более одного раза",{"type":725,"tag":1296,"props":1363,"children":1364},{},[1365],{"type":730,"value":1366},"Иногда требуется конвертация в массив, если нужен именно массив",{"type":725,"tag":1259,"props":1368,"children":1369},{},[1370,1380,1385,1396,1401],{"type":725,"tag":1296,"props":1371,"children":1372},{},[1373,1375],{"type":730,"value":1374},"3) Object со значениями ",{"type":725,"tag":740,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":730,"value":796},{"type":725,"tag":1296,"props":1381,"children":1382},{},[1383],{"type":730,"value":1384},"“Словарь” строк → булево значение",{"type":725,"tag":1296,"props":1386,"children":1387},{},[1388,1390],{"type":730,"value":1389},"Проверка через чтение свойства, например ",{"type":725,"tag":740,"props":1391,"children":1393},{"className":1392},[],[1394],{"type":730,"value":1395},"dict[s] === true",{"type":725,"tag":1296,"props":1397,"children":1398},{},[1399],{"type":730,"value":1400},"Нет (уникальность поддерживается логикой записи по ключу)",{"type":725,"tag":1296,"props":1402,"children":1403},{},[1404,1406],{"type":730,"value":1405},"Прототип и “случайные ключи”, безопаснее применять ",{"type":725,"tag":740,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":730,"value":1145},{"type":725,"tag":1259,"props":1412,"children":1413},{},[1414,1431,1436,1445,1450],{"type":725,"tag":1296,"props":1415,"children":1416},{},[1417,1419,1424,1426],{"type":730,"value":1418},"4) ",{"type":725,"tag":740,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":730,"value":811},{"type":730,"value":1425}," со значениями ",{"type":725,"tag":740,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":730,"value":796},{"type":725,"tag":1296,"props":1432,"children":1433},{},[1434],{"type":730,"value":1435},"Словарь ключ → значение, ключ уникален",{"type":725,"tag":1296,"props":1437,"children":1438},{},[1439],{"type":725,"tag":740,"props":1440,"children":1442},{"className":1441},[],[1443],{"type":730,"value":1444},"has(key)",{"type":725,"tag":1296,"props":1446,"children":1447},{},[1448],{"type":730,"value":1449},"Да (ключ встречается один раз)",{"type":725,"tag":1296,"props":1451,"children":1452},{},[1453,1455,1460],{"type":730,"value":1454},"Для задачи “только уникальные строки” обычно избыточен по смыслу, потому что ",{"type":725,"tag":740,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":730,"value":781},{"type":730,"value":1461}," выражает задачу точнее",{"type":725,"tag":726,"props":1463,"children":1464},{},[1465],{"type":730,"value":1466},"Мини-схема разницы подходов (идея работы):",{"type":725,"tag":726,"props":1468,"children":1469},{},[1470],{"type":730,"value":1471},"Вариант 1 (Array):",{"type":725,"tag":733,"props":1473,"children":1476},{"className":1474,"code":1475,"language":730},[736],"элемент -> includes(линейный поиск) -> если нет -> push\n",[1477],{"type":725,"tag":740,"props":1478,"children":1479},{"__ignoreMap":742},[1480],{"type":730,"value":1475},{"type":725,"tag":726,"props":1482,"children":1483},{},[1484],{"type":730,"value":1485},"Вариант 2 (Set):",{"type":725,"tag":733,"props":1487,"children":1490},{"className":1488,"code":1489,"language":730},[736],"элемент -> add(встроенная уникальность) -> повтор “игнорируется”\n",[1491],{"type":725,"tag":740,"props":1492,"children":1493},{"__ignoreMap":742},[1494],{"type":730,"value":1489},{"data":1496,"body":1497},{},{"type":722,"children":1498},[1499,1512],{"type":725,"tag":726,"props":1500,"children":1501},{},[1502,1504,1510],{"type":730,"value":1503},"Для получения уникальных строк из массива достаточно ",{"type":725,"tag":740,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":730,"value":1509},"const unique = [...new Set(list)]",{"type":730,"value":1511},", и порядок будет соответствовать первому появлению элементов во входном массиве (то есть сохраняется “порядок первых вхождений”).",{"type":725,"tag":733,"props":1513,"children":1516},{"className":1514,"code":1515,"language":730},[736],"const list = ['a', 'b', 'a', 'c', 'b'];\nconst unique = [...new Set(list)];\n// unique: ['a', 'b', 'c']\n",[1517],{"type":725,"tag":740,"props":1518,"children":1519},{"__ignoreMap":742},[1520],{"type":730,"value":1515},{"data":1522,"body":1523},{},{"type":722,"children":1524},[1525,1530],{"type":725,"tag":726,"props":1526,"children":1527},{},[1528],{"type":730,"value":1529},"Объект может быть удобен, когда требуется сериализация в JSON или максимально простой формат “ключ → признак”, но безопаснее создавать объект без прототипа, чтобы уменьшить риск конфликтов по именам ключей.",{"type":725,"tag":733,"props":1531,"children":1534},{"className":1532,"code":1533,"language":730},[736],"const list = ['a', 'b', 'a', 'c', 'b'];\n\nconst dict = Object.create(null);\nfor (const s of list) {\n  dict[s] = true;\n}\n\n// Проверка наличия\nconst hasA = dict['a'] === true;\n\n// Если нужны уникальные строки массивом\nconst unique = Object.keys(dict);\n",[1535],{"type":725,"tag":740,"props":1536,"children":1537},{"__ignoreMap":742},[1538],{"type":730,"value":1533},{"data":1540,"body":1541},{},{"type":722,"children":1542},[1543],{"type":725,"tag":726,"props":1544,"children":1545},{},[1546,1548,1553,1555,1560],{"type":730,"value":1547},"Если требуется хранить произвольные ключи (не только строки) или важна безопасная работа с пользовательскими ключами, то ",{"type":725,"tag":740,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":730,"value":811},{"type":730,"value":1554}," обычно предпочтительнее объекта, потому что ",{"type":725,"tag":740,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":730,"value":811},{"type":730,"value":1561}," не имеет “случайных” ключей по умолчанию и лучше подходит именно для динамического словаря.",{"data":1563,"body":1564},{},{"type":722,"children":1565},[1566,1585],{"type":725,"tag":726,"props":1567,"children":1568},{},[1569,1571,1576,1578,1583],{"type":730,"value":1570},"Для подсчёта повторов естественнее перейти с ",{"type":725,"tag":740,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":730,"value":781},{"type":730,"value":1577}," на ",{"type":725,"tag":740,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":730,"value":811},{"type":730,"value":1584},", потому что появляется значение-счётчик, а не только факт уникальности.",{"type":725,"tag":733,"props":1586,"children":1589},{"className":1587,"code":1588,"language":730},[736],"const list = ['a', 'b', 'a', 'c', 'b'];\nconst counts = new Map();\n\nfor (const s of list) {\n  counts.set(s, (counts.get(s) ?? 0) + 1);\n}\n\n// counts.get('a') -> 2\n// counts.get('b') -> 2\n// counts.get('c') -> 1\n",[1590],{"type":725,"tag":740,"props":1591,"children":1592},{"__ignoreMap":742},[1593],{"type":730,"value":1588},{"data":1595,"body":1596},{},{"type":722,"children":1597},[1598],{"type":725,"tag":726,"props":1599,"children":1600},{},[1601,1603,1608,1610,1615,1616,1621,1623,1628,1630,1635],{"type":730,"value":1602},"Итого: для списка уникальных строк наиболее подходящим выбором является ",{"type":725,"tag":740,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":730,"value":781},{"type":730,"value":1609},", потому что он хранит только уникальные значения и обеспечивает эффективные ",{"type":725,"tag":740,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":730,"value":970},{"type":730,"value":902},{"type":725,"tag":740,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":730,"value":978},{"type":730,"value":1622},"; массив с ",{"type":725,"tag":740,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":730,"value":764},{"type":730,"value":1629}," проще, но хуже масштабируется, объект и ",{"type":725,"tag":740,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":730,"value":811},{"type":730,"value":1636}," решают похожую задачу, но обычно менее уместны, если нужны только уникальные строки.",1775735655417]