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