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