[{"data":1,"prerenderedAt":1164},["ShallowReactive",2],{"$fWgdnqpfFvgz3jSTs3lm-eDHwQMBAc7MyfUEdeMxSSt4":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":92,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":95,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":100,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":446,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":667,"mdc-9yl4n3-key":687,"mdc--7xsy7m-key":732,"mdc--v9789j-key":780,"mdc-pljksx-key":869,"mdc--uz8xz3-key":966,"mdc--9wnhhz-key":994,"mdc--y1u4io-key":1126},{"content":4,"livecodingContent":51,"type":79,"pageMeta":80},[5,9,13,17,20,24,27,31,34,38,41,45,48],{"id":6,"value":7,"isTypeH1":8},"1984","Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4622","Теория по задаче","theory-for-the-task",{"id":14,"value":15,"anchor":16,"isTypeH3":8},"4663","Что требуется по смыслу","what-is-required-in-meaning",{"id":18,"value":19,"isTypeParagraph":8},"10636","Требуется вариативная функция: количество аргументов заранее неизвестно, но первый аргумент всегда особый (разделитель), а остальные — элементы, которые необходимо объединить.\n\nПоследовательность действий:\n1) Принять `separator`.\n2) Собрать остальные аргументы в список (массив).\n3) Вернуть строку, полученную соединением элементов списка через `separator`.",{"id":21,"value":22,"anchor":23,"isTypeH3":8},"4664","Остаточные параметры (rest parameters)","rest-parameters",{"id":25,"value":26,"isTypeParagraph":8},"10637","Остаточные параметры записываются как `...parts` в конце списка параметров функции и собирают все “лишние” аргументы в массив.\n\nПример сопоставления при вызове:\n- Вызов: `func(\"*\", \"13\", \"sb\", \"1bc\")`\n- Внутри:\n  - `separator` становится `\"*\"`\n  - `parts` становится `[\"13\", \"sb\", \"1bc\"]`\n\nПреимущество: `parts` — это уже Array, поэтому можно сразу вызывать методы массива.",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4665","Метод Array.prototype.join()","arrayprototypejoin-method",{"id":32,"value":33,"isTypeParagraph":8},"10638","Метод `join(separator)` возвращает новую строку, соединяя элементы массива и вставляя разделитель между соседними элементами.\n\nБазовое правило:\n- `[\"a\", \"b\", \"c\"].join(\"*\")` даёт `\"a*b*c\"`.\n\nВажные “краевые” случаи:\n- Если массив пустой, результат — пустая строка `\"\"`.\n- Если элемент массива равен `null` или `undefined`, он превращается в пустую строку при соединении.\n- Остальные типы обычно приводятся к строке (например, число 10 станет `\"10\"`).",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4666","Почему первый аргумент не должен попасть в склейку","why-first-argument-is-not-joined",{"id":39,"value":40,"isTypeParagraph":8},"10639","Разделитель — это “правило склейки”, а не “часть данных”, поэтому он отделяется от остального.\n\nНаглядный поток данных:\n\n```\nВходные аргументы:  (\"*\", \"1\", \"b\", \"1c\")\n                     │\n                     ├─ separator = \"*\"\n                     │\n                     └─ parts = [\"1\", \"b\", \"1c\"]\n                               │\n                               └─ parts.join(\"*\") = \"1*b*1c\"\n```\n\nЕсли по ошибке склеивать все аргументы как данные, получится лишний символ разделителя в начале результата.",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4667","Rest parameters и arguments: что выбрать","rest-parameters-vs-arguments-what-to-choose",{"id":46,"value":47,"isTypeParagraph":8},"10640","В современных проектах чаще применяется `...parts`, потому что это проще и безопаснее для начинающего разработчика (меньше преобразований, меньше “скрытых” особенностей).\n\n| Критерий | rest parameters (`...parts`) | `arguments` |\n|---|---|---|\n| Что получается внутри функции | Настоящий массив (Array) | Массивоподобный объект |\n| Нужно ли преобразование в массив | Нет | Да, если нужны методы массива |\n| Что включает | Только аргументы после именованных параметров | Все аргументы функции |\n| Читаемость | Обычно выше | Обычно ниже (требуются дополнительные действия) |",{"id":49,"value":50,"isTypeParagraph":8},"10641","Кратко: для решения требуется принять разделитель первым параметром, собрать все остальные аргументы в массив (через `...parts` или через преобразование `arguments`), затем вернуть результат `join()`; рекомендуемая форма: `function func(sep, ...parts) { return parts.join(sep) }`.",{"id":52,"functionTestData":53,"functionName":75,"functionTemplateCode":76,"solution":77,"description":78},"425",[54,61,67,71],[55,60],[56,57,58,59],"*","1","b","1c","1*b*1c",[62,66],[56,63,64,65],"13","sb","1bc","13*sb*1bc",[68,70],[56,63,64,65,69],"32tg","13*sb*1bc*32tg",[72,74],[56,63,64,65,69,73],"3gg5","13*sb*1bc*32tg*3gg5","func","// Ваш код здесь\nfunction func() {}","**Вариант A** (современный JavaScript, рекомендуемый)\nЛогика: разделитель принимается отдельным параметром, а все остальные значения попадают в массив и затем склеиваются через `join()`.\n\n```\nfunction func(separator, ...parts) {\n  return parts.join(separator);\n}\n```\n\n**Вариант B** (чуть более “защитный”)\nИногда полезно явно приводить разделитель к строке, если потенциально может прийти число, логическое значение и т.п.\n\n```\nfunction func(separator, ...parts) {\n  const sep = String(separator);\n  return parts.join(sep);\n}\n```\n\n**Вариант C** (ES5/наследуемый код через arguments)\nВ старом коде может встречаться объект `arguments`, который содержит все аргументы функции, но не является настоящим массивом, поэтому для удобства обычно требуется преобразование.\n\n```\nfunction func(separator) {\n  var parts = Array.prototype.slice.call(arguments, 1);\n  return parts.join(separator);\n}\n```\n\n`arguments` — массивоподобный объект: у него есть индексы и длина, но это не Array, поэтому методы массива напрямую к нему обычно не применяются без преобразования.","Необходимо реализовать функцию, принимающую аргументы `\"*\", \"1\", \"b\", \"1c\"` и возвращающую строку `\"1*b*1c\"`\n\nПримеры:\n\n```\nfunc(\"*\", \"1\", \"b\", \"1c\") === \"1*b*1c\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\") === \"13*sb*1bc\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\") === \"13*sb*1bc*32tg\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\", \"3gg5\") === \"13*sb*1bc*32tg*3gg5\"\n```","livecoding",{"title":81,"description":82,"ogTitle":7,"ogDescription":83,"ogImageUrl":84,"canonical":85,"ogLocale":86,"ogSiteName":87,"ogImageType":88,"ogImageWidth":89,"ogImageHeight":90,"ogType":91,"ogUrl":85},"Реализовать функцию, возвращающая строку \"1*b*1c\"","f(\"*\", \"1\", \"b\", \"1c\") === '1*b*1c',\nf(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\") === '13*sb*1bc*32tg'","f(\"*\", \"1\", \"b\", \"1c\") === '1*b*1c', f(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\") === '13*sb*1bc*32tg' f(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\", \"3gg5\") === '13*sb*1bc*32tg*3gg5'","/og-image.png",null,"ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":93,"siteUrl":94},"GOOD WEB JOB!","https://goodwebjob.ru",[96],{"label":97,"slug":98,"to":99},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":101,"navigationSublist":110},[102,106],{"path":99,"isActive":103,"name":104,"icon":105,"isNavbarMobileDisabled":8},false,"С чего начать?","material-symbols:visibility-outline-rounded",{"path":107,"isActive":8,"name":108,"icon":109,"isNavbarMobileDisabled":103},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[111,120,147,159,165,305,329,338,344,407,428,434],{"title":112,"list":113,"isOpened":103},"Bash",[114,117],{"name":115,"path":116,"isActive":103},"Дан фрагмент 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":118,"path":119,"isActive":103},"Дан фрагмент 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":121,"list":122,"isOpened":103},"CSS",[123,126,129,132,135,138,141,144],{"name":124,"path":125,"isActive":103},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":127,"path":128,"isActive":103},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":130,"path":131,"isActive":103},"Есть шаблон вложенного 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":133,"path":134,"isActive":103},"Есть шаблон вложенного 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":136,"path":137,"isActive":103},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":139,"path":140,"isActive":103},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":142,"path":143,"isActive":103},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":145,"path":146,"isActive":103},"Есть 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":148,"list":149,"isOpened":103},"Git",[150,153,156],{"name":151,"path":152,"isActive":103},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/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":154,"path":155,"isActive":103},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":157,"path":158,"isActive":103},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":160,"list":161,"isOpened":103},"HTML",[162],{"name":163,"path":164,"isActive":103},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":166,"list":167,"isOpened":103},"JavaScript",[168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,296,299,302],{"name":169,"path":170,"isActive":103},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":172,"path":173,"isActive":103},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":175,"path":176,"isActive":103},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":178,"path":179,"isActive":103},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":181,"path":182,"isActive":103},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":184,"path":185,"isActive":103},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":187,"path":188,"isActive":103},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение 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":190,"path":191,"isActive":103},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":193,"path":194,"isActive":103},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":196,"path":197,"isActive":103},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":199,"path":200,"isActive":103},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":202,"path":203,"isActive":103},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":205,"path":206,"isActive":103},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":208,"path":209,"isActive":103},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":211,"path":212,"isActive":103},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":214,"path":215,"isActive":103},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":217,"path":218,"isActive":103},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":220,"path":221,"isActive":103},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":223,"path":224,"isActive":103},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":226,"path":227,"isActive":103},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":229,"path":230,"isActive":103},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":232,"path":233,"isActive":103},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":235,"path":236,"isActive":103},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":238,"path":239,"isActive":103},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":241,"path":242,"isActive":103},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":244,"path":245,"isActive":103},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":247,"path":248,"isActive":103},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":250,"path":251,"isActive":103},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":253,"path":254,"isActive":103},"Вернуть массив от 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":256,"path":257,"isActive":103},"Дана строка: '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":259,"path":260,"isActive":103},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":262,"path":263,"isActive":103},"Для каждого вложенного объекта нужно добавить свойство 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":265,"path":266,"isActive":103},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":268,"path":269,"isActive":103},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":271,"path":272,"isActive":103},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":274,"path":275,"isActive":103},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":277,"path":278,"isActive":103}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":280,"path":281,"isActive":103},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":283,"path":284,"isActive":103},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":286,"path":287,"isActive":103},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":289,"path":290,"isActive":103},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":292,"path":293,"isActive":103},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":7,"path":295,"isActive":103},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":297,"path":298,"isActive":103},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":300,"path":301,"isActive":103},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":303,"path":304,"isActive":103},"Числа от 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":306,"list":307,"isOpened":103},"React",[308,311,314,317,320,323,326],{"name":309,"path":310,"isActive":103},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":312,"path":313,"isActive":103},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":315,"path":316,"isActive":103},"Если убрать в 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":318,"path":319,"isActive":103},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":321,"path":322,"isActive":103},"Есть код, в котором список и кнопка. Что в реальном 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":324,"path":325,"isActive":103},"Зачем нужен 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":327,"path":328,"isActive":103},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/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":330,"list":331,"isOpened":103},"Алгоритмы",[332,335],{"name":333,"path":334,"isActive":103},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":336,"path":337,"isActive":103},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":339,"list":340,"isOpened":103},"Дебаггинг",[341],{"name":342,"path":343,"isActive":103},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/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":345,"list":346,"isOpened":103},"Компьютерные сети",[347,350,353,356,359,362,365,368,371,374,377,380,383,386,389,392,395,398,401,404],{"name":348,"path":349,"isActive":103},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":351,"path":352,"isActive":103},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":354,"path":355,"isActive":103},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":357,"path":358,"isActive":103},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":360,"path":361,"isActive":103},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":363,"path":364,"isActive":103},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":366,"path":367,"isActive":103},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":369,"path":370,"isActive":103},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":372,"path":373,"isActive":103},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":375,"path":376,"isActive":103},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":378,"path":379,"isActive":103},"Чем отличаются 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":381,"path":382,"isActive":103},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/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":384,"path":385,"isActive":103},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":387,"path":388,"isActive":103},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":390,"path":391,"isActive":103},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":393,"path":394,"isActive":103},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/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":396,"path":397,"isActive":103},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":399,"path":400,"isActive":103},"Все данные зашифрованы, используется 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":402,"path":403,"isActive":103},"Есть веб-приложение. Помимо 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":405,"path":406,"isActive":103},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":408,"list":409,"isOpened":103},"Отрисовка в браузере",[410,413,416,419,422,425],{"name":411,"path":412,"isActive":103},"Что происходит, когда 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":414,"path":415,"isActive":103},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":417,"path":418,"isActive":103},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":420,"path":421,"isActive":103},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":423,"path":424,"isActive":103},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":426,"path":427,"isActive":103},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":429,"list":430,"isOpened":103},"Ревью кода",[431],{"name":432,"path":433,"isActive":103},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":435,"list":436,"isOpened":103},"Теория вероятности",[437,440,443],{"name":438,"path":439,"isActive":103},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/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":441,"path":442,"isActive":103},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/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":444,"path":445,"isActive":103},"Как гарантированно найти лёгкую фальшивую монету среди 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":447},[448,451,453,455,457,460,463,465,467,469,471,473,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,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,646,648,650,652,654,656,657,659,661,663,665],{"name":449,"value":450},"Теоретические задания","theoretical-tasks",{"name":205,"value":452},"what-this-code-will-return-typeof-function",{"name":104,"value":454},"where-to-begin",{"name":172,"value":456},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":458,"value":459},"Backend","backend",{"name":461,"value":462},"Frontend","frontend",{"name":169,"value":464},"prototype-what-logical-values-will-be-received-in-console-log",{"name":286,"value":466},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":277,"value":468},"find-non-repeating-numbers-in-an-array",{"name":250,"value":470},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":256,"value":472},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":474,"value":475},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":262,"value":477},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":178,"value":479},"what-value-will-the-console-output-with-object-property",{"name":181,"value":481},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":253,"value":483},"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":283,"value":485},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":289,"value":487},"determines-whether-a-word-is-a-palindrome",{"name":268,"value":489},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":7,"value":491},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":259,"value":493},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":265,"value":495},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":271,"value":497},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":303,"value":499},"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":274,"value":501},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":280,"value":503},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":184,"value":505},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":187,"value":507},"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":199,"value":509},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":202,"value":511},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":300,"value":513},"unifying-values-in-an-array",{"name":292,"value":515},"flattening-the-array",{"name":190,"value":517},"what-will-the-book-get-upper-name-method-return",{"name":297,"value":519},"string-compression",{"name":196,"value":521},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":208,"value":523},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":348,"value":525},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":354,"value":527},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":357,"value":529},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":360,"value":531},"key-differences-between-tcp-and-udp",{"name":363,"value":533},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":366,"value":535},"what-is-http-and-what-does-it-consist-of",{"name":369,"value":537},"what-are-http-headers-and-why-do-we-need-them",{"name":372,"value":539},"what-are-http-parameters",{"name":375,"value":541},"where-is-the-html-code-located-in-the-http-response-structure",{"name":163,"value":543},"what-is-html",{"name":378,"value":545},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":381,"value":547},"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":384,"value":549},"what-is-a-cookie",{"name":387,"value":551},"who-initiates-the-cookie-recording-in-the-browser",{"name":390,"value":553},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":555,"value":79},"Лайвкодинг",{"name":175,"value":557},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":396,"value":559},"is-everything-that-goes-through-https-secure",{"name":399,"value":561},"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":402,"value":563},"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":414,"value":565},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":411,"value":567},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":417,"value":569},"what-is-blocking-the-page-rendering-in-the-browser",{"name":420,"value":571},"what-is-dom-in-a-browser-what-is-cssom",{"name":423,"value":573},"what-are-nodes-in-the-dom",{"name":426,"value":575},"what-does-cssom-consist-of",{"name":124,"value":577},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":127,"value":579},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":130,"value":581},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":133,"value":583},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":136,"value":585},"there-is-an-html-code-will-font-weight-affect-span",{"name":139,"value":587},"what-are-the-differences-between-flexbox-and-grid",{"name":142,"value":589},"do-flexbox-and-grid-replace-each-other",{"name":145,"value":591},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":108,"value":593},"tasks",{"name":211,"value":595},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":214,"value":597},"what-is-this-in-javascript",{"name":217,"value":599},"what-is-an-event-loop-and-how-does-it-work",{"name":220,"value":601},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":223,"value":603},"what-does-the-typeof-operator-show-in-javascript",{"name":226,"value":605},"what-types-of-data-exist-in-javascript",{"name":229,"value":607},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":232,"value":609},"what-will-typeof-return-for-an-array",{"name":235,"value":611},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":238,"value":613},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":241,"value":615},"what-does-typeof-return-for-new-set-in-javascript",{"name":309,"value":617},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":315,"value":619},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":318,"value":621},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":321,"value":623},"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":324,"value":625},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":342,"value":627},"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":151,"value":629},"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":154,"value":631},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":157,"value":633},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":432,"value":635},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":115,"value":637},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":118,"value":639},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":333,"value":641},"what-is-algorithmic-complexity",{"name":336,"value":643},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":244,"value":645},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":405,"value":647},"how-can-a-user-be-authorized-on-a-website",{"name":247,"value":649},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":438,"value":651},"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":441,"value":653},"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":444,"value":655},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":97,"value":98},{"name":393,"value":658},"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":351,"value":660},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":193,"value":662},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":312,"value":664},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":327,"value":666},"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":668,"copyright":671,"reportError":672,"socialNetwork":674},{"link":669,"title":670},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":673,"link":669},"Сообщить об ошибке",{"label":675,"socialNetworkList":676},"Мы в соцсетях:",[677,680,683],{"icon":85,"link":678,"title":679},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":681,"link":669,"title":682},"ic:baseline-telegram","Telegram",{"icon":684,"link":685,"title":686},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":688,"body":689},{},{"type":690,"children":691},"root",[692,715,720],{"type":693,"tag":694,"props":695,"children":696},"element","p",{},[697,700,707,709],{"type":698,"value":699},"text","Необходимо реализовать функцию, принимающую аргументы ",{"type":693,"tag":701,"props":702,"children":704},"code",{"className":703},[],[705],{"type":698,"value":706},"\"*\", \"1\", \"b\", \"1c\"",{"type":698,"value":708}," и возвращающую строку ",{"type":693,"tag":701,"props":710,"children":712},{"className":711},[],[713],{"type":698,"value":714},"\"1*b*1c\"",{"type":693,"tag":694,"props":716,"children":717},{},[718],{"type":698,"value":719},"Примеры:",{"type":693,"tag":721,"props":722,"children":726},"pre",{"className":723,"code":725,"language":698},[724],"language-text","func(\"*\", \"1\", \"b\", \"1c\") === \"1*b*1c\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\") === \"13*sb*1bc\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\") === \"13*sb*1bc*32tg\",\nfunc(\"*\", \"13\", \"sb\", \"1bc\", \"32tg\", \"3gg5\") === \"13*sb*1bc*32tg*3gg5\"\n",[727],{"type":693,"tag":701,"props":728,"children":730},{"__ignoreMap":729},"",[731],{"type":698,"value":725},{"data":733,"body":734},{},{"type":690,"children":735},[736,741,746],{"type":693,"tag":694,"props":737,"children":738},{},[739],{"type":698,"value":740},"Требуется вариативная функция: количество аргументов заранее неизвестно, но первый аргумент всегда особый (разделитель), а остальные — элементы, которые необходимо объединить.",{"type":693,"tag":694,"props":742,"children":743},{},[744],{"type":698,"value":745},"Последовательность действий:",{"type":693,"tag":747,"props":748,"children":749},"ol",{},[750,764,769],{"type":693,"tag":751,"props":752,"children":753},"li",{},[754,756,762],{"type":698,"value":755},"Принять ",{"type":693,"tag":701,"props":757,"children":759},{"className":758},[],[760],{"type":698,"value":761},"separator",{"type":698,"value":763},".",{"type":693,"tag":751,"props":765,"children":766},{},[767],{"type":698,"value":768},"Собрать остальные аргументы в список (массив).",{"type":693,"tag":751,"props":770,"children":771},{},[772,774,779],{"type":698,"value":773},"Вернуть строку, полученную соединением элементов списка через ",{"type":693,"tag":701,"props":775,"children":777},{"className":776},[],[778],{"type":698,"value":761},{"type":698,"value":763},{"data":781,"body":782},{},{"type":690,"children":783},[784,797,802,857],{"type":693,"tag":694,"props":785,"children":786},{},[787,789,795],{"type":698,"value":788},"Остаточные параметры записываются как ",{"type":693,"tag":701,"props":790,"children":792},{"className":791},[],[793],{"type":698,"value":794},"...parts",{"type":698,"value":796}," в конце списка параметров функции и собирают все “лишние” аргументы в массив.",{"type":693,"tag":694,"props":798,"children":799},{},[800],{"type":698,"value":801},"Пример сопоставления при вызове:",{"type":693,"tag":803,"props":804,"children":805},"ul",{},[806,817],{"type":693,"tag":751,"props":807,"children":808},{},[809,811],{"type":698,"value":810},"Вызов: ",{"type":693,"tag":701,"props":812,"children":814},{"className":813},[],[815],{"type":698,"value":816},"func(\"*\", \"13\", \"sb\", \"1bc\")",{"type":693,"tag":751,"props":818,"children":819},{},[820,822],{"type":698,"value":821},"Внутри:\n",{"type":693,"tag":803,"props":823,"children":824},{},[825,841],{"type":693,"tag":751,"props":826,"children":827},{},[828,833,835],{"type":693,"tag":701,"props":829,"children":831},{"className":830},[],[832],{"type":698,"value":761},{"type":698,"value":834}," становится ",{"type":693,"tag":701,"props":836,"children":838},{"className":837},[],[839],{"type":698,"value":840},"\"*\"",{"type":693,"tag":751,"props":842,"children":843},{},[844,850,851],{"type":693,"tag":701,"props":845,"children":847},{"className":846},[],[848],{"type":698,"value":849},"parts",{"type":698,"value":834},{"type":693,"tag":701,"props":852,"children":854},{"className":853},[],[855],{"type":698,"value":856},"[\"13\", \"sb\", \"1bc\"]",{"type":693,"tag":694,"props":858,"children":859},{},[860,862,867],{"type":698,"value":861},"Преимущество: ",{"type":693,"tag":701,"props":863,"children":865},{"className":864},[],[866],{"type":698,"value":849},{"type":698,"value":868}," — это уже Array, поэтому можно сразу вызывать методы массива.",{"data":870,"body":871},{},{"type":690,"children":872},[873,886,891,912,917],{"type":693,"tag":694,"props":874,"children":875},{},[876,878,884],{"type":698,"value":877},"Метод ",{"type":693,"tag":701,"props":879,"children":881},{"className":880},[],[882],{"type":698,"value":883},"join(separator)",{"type":698,"value":885}," возвращает новую строку, соединяя элементы массива и вставляя разделитель между соседними элементами.",{"type":693,"tag":694,"props":887,"children":888},{},[889],{"type":698,"value":890},"Базовое правило:",{"type":693,"tag":803,"props":892,"children":893},{},[894],{"type":693,"tag":751,"props":895,"children":896},{},[897,903,905,911],{"type":693,"tag":701,"props":898,"children":900},{"className":899},[],[901],{"type":698,"value":902},"[\"a\", \"b\", \"c\"].join(\"*\")",{"type":698,"value":904}," даёт ",{"type":693,"tag":701,"props":906,"children":908},{"className":907},[],[909],{"type":698,"value":910},"\"a*b*c\"",{"type":698,"value":763},{"type":693,"tag":694,"props":913,"children":914},{},[915],{"type":698,"value":916},"Важные “краевые” случаи:",{"type":693,"tag":803,"props":918,"children":919},{},[920,932,953],{"type":693,"tag":751,"props":921,"children":922},{},[923,925,931],{"type":698,"value":924},"Если массив пустой, результат — пустая строка ",{"type":693,"tag":701,"props":926,"children":928},{"className":927},[],[929],{"type":698,"value":930},"\"\"",{"type":698,"value":763},{"type":693,"tag":751,"props":933,"children":934},{},[935,937,943,945,951],{"type":698,"value":936},"Если элемент массива равен ",{"type":693,"tag":701,"props":938,"children":940},{"className":939},[],[941],{"type":698,"value":942},"null",{"type":698,"value":944}," или ",{"type":693,"tag":701,"props":946,"children":948},{"className":947},[],[949],{"type":698,"value":950},"undefined",{"type":698,"value":952},", он превращается в пустую строку при соединении.",{"type":693,"tag":751,"props":954,"children":955},{},[956,958,964],{"type":698,"value":957},"Остальные типы обычно приводятся к строке (например, число 10 станет ",{"type":693,"tag":701,"props":959,"children":961},{"className":960},[],[962],{"type":698,"value":963},"\"10\"",{"type":698,"value":965},").",{"data":967,"body":968},{},{"type":690,"children":969},[970,975,980,989],{"type":693,"tag":694,"props":971,"children":972},{},[973],{"type":698,"value":974},"Разделитель — это “правило склейки”, а не “часть данных”, поэтому он отделяется от остального.",{"type":693,"tag":694,"props":976,"children":977},{},[978],{"type":698,"value":979},"Наглядный поток данных:",{"type":693,"tag":721,"props":981,"children":984},{"className":982,"code":983,"language":698},[724],"Входные аргументы:  (\"*\", \"1\", \"b\", \"1c\")\n                     │\n                     ├─ separator = \"*\"\n                     │\n                     └─ parts = [\"1\", \"b\", \"1c\"]\n                               │\n                               └─ parts.join(\"*\") = \"1*b*1c\"\n",[985],{"type":693,"tag":701,"props":986,"children":987},{"__ignoreMap":729},[988],{"type":698,"value":983},{"type":693,"tag":694,"props":990,"children":991},{},[992],{"type":698,"value":993},"Если по ошибке склеивать все аргументы как данные, получится лишний символ разделителя в начале результата.",{"data":995,"body":996},{},{"type":690,"children":997},[998,1010],{"type":693,"tag":694,"props":999,"children":1000},{},[1001,1003,1008],{"type":698,"value":1002},"В современных проектах чаще применяется ",{"type":693,"tag":701,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":698,"value":794},{"type":698,"value":1009},", потому что это проще и безопаснее для начинающего разработчика (меньше преобразований, меньше “скрытых” особенностей).",{"type":693,"tag":1011,"props":1012,"children":1013},"table",{},[1014,1049],{"type":693,"tag":1015,"props":1016,"children":1017},"thead",{},[1018],{"type":693,"tag":1019,"props":1020,"children":1021},"tr",{},[1022,1028,1040],{"type":693,"tag":1023,"props":1024,"children":1025},"th",{},[1026],{"type":698,"value":1027},"Критерий",{"type":693,"tag":1023,"props":1029,"children":1030},{},[1031,1033,1038],{"type":698,"value":1032},"rest parameters (",{"type":693,"tag":701,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":698,"value":794},{"type":698,"value":1039},")",{"type":693,"tag":1023,"props":1041,"children":1042},{},[1043],{"type":693,"tag":701,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":698,"value":1048},"arguments",{"type":693,"tag":1050,"props":1051,"children":1052},"tbody",{},[1053,1072,1090,1108],{"type":693,"tag":1019,"props":1054,"children":1055},{},[1056,1062,1067],{"type":693,"tag":1057,"props":1058,"children":1059},"td",{},[1060],{"type":698,"value":1061},"Что получается внутри функции",{"type":693,"tag":1057,"props":1063,"children":1064},{},[1065],{"type":698,"value":1066},"Настоящий массив (Array)",{"type":693,"tag":1057,"props":1068,"children":1069},{},[1070],{"type":698,"value":1071},"Массивоподобный объект",{"type":693,"tag":1019,"props":1073,"children":1074},{},[1075,1080,1085],{"type":693,"tag":1057,"props":1076,"children":1077},{},[1078],{"type":698,"value":1079},"Нужно ли преобразование в массив",{"type":693,"tag":1057,"props":1081,"children":1082},{},[1083],{"type":698,"value":1084},"Нет",{"type":693,"tag":1057,"props":1086,"children":1087},{},[1088],{"type":698,"value":1089},"Да, если нужны методы массива",{"type":693,"tag":1019,"props":1091,"children":1092},{},[1093,1098,1103],{"type":693,"tag":1057,"props":1094,"children":1095},{},[1096],{"type":698,"value":1097},"Что включает",{"type":693,"tag":1057,"props":1099,"children":1100},{},[1101],{"type":698,"value":1102},"Только аргументы после именованных параметров",{"type":693,"tag":1057,"props":1104,"children":1105},{},[1106],{"type":698,"value":1107},"Все аргументы функции",{"type":693,"tag":1019,"props":1109,"children":1110},{},[1111,1116,1121],{"type":693,"tag":1057,"props":1112,"children":1113},{},[1114],{"type":698,"value":1115},"Читаемость",{"type":693,"tag":1057,"props":1117,"children":1118},{},[1119],{"type":698,"value":1120},"Обычно выше",{"type":693,"tag":1057,"props":1122,"children":1123},{},[1124],{"type":698,"value":1125},"Обычно ниже (требуются дополнительные действия)",{"data":1127,"body":1128},{},{"type":690,"children":1129},[1130],{"type":693,"tag":694,"props":1131,"children":1132},{},[1133,1135,1140,1142,1147,1149,1155,1157,1163],{"type":698,"value":1134},"Кратко: для решения требуется принять разделитель первым параметром, собрать все остальные аргументы в массив (через ",{"type":693,"tag":701,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":698,"value":794},{"type":698,"value":1141}," или через преобразование ",{"type":693,"tag":701,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":698,"value":1048},{"type":698,"value":1148},"), затем вернуть результат ",{"type":693,"tag":701,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":698,"value":1154},"join()",{"type":698,"value":1156},"; рекомендуемая форма: ",{"type":693,"tag":701,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":698,"value":1162},"function func(sep, ...parts) { return parts.join(sep) }",{"type":698,"value":763},1775575822656]