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