[{"data":1,"prerenderedAt":1337},["ShallowReactive",2],{"$fSDnvj51NM7_SR7CY8357QaSNd0zHqO1KBYXHMGpQptI":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":111,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":114,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":119,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":464,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":686,"mdc-xi3ciw-key":706,"mdc--7g7euz-key":718,"mdc-bm1x83-key":744,"mdc-r2sijx-key":752,"mdc-1gqmnt-key":768,"mdc-paiqn6-key":784,"mdc-zayemf-key":800,"mdc-ktowbe-key":821,"mdc--tjij6-key":895,"mdc-446hhg-key":911,"mdc--49yifg-key":966,"mdc-vwfdh9-key":974,"mdc-ygylsy-key":1143,"mdc-b9oq1d-key":1161,"mdc-yuefab-key":1179,"mdc--y8187f-key":1225,"mdc-hkumdg-key":1250,"mdc--t7tb68-key":1272,"mdc-sqje6v-key":1285,"mdc-9nk3y2-key":1321},{"content":4,"quizQuestionContent":81,"type":100,"pageMeta":101},[5,9,13,16,20,24,27,30,34,37,41,45,48,52,55,58,62,65,68,72,75,78],{"id":6,"value":7,"isTypeH1":8},"1921","Почему одинаковые объекты дают false в js",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4424","Ключевая теория: равенство в JavaScript","key-theory-equality-in-javascript",{"id":14,"value":15,"isTypeParagraph":8},"10184","В JavaScript значения делятся на примитивы (например, `number`, `string`, `boolean`, `null`, `undefined`, `bigint`, `symbol`) и объекты (в том числе массивы, функции, даты).\nДля примитивов сравнение `===` обычно означает “одно и то же значение”, а для объектов `===` означает “одна и та же ссылка (тот же самый объект в памяти)”.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"660","Сравнение объектов “по содержимому” (чтобы совпадали все поля и их значения) не является задачей оператора `===`; для этого нужны отдельные алгоритмы “глубокого сравнения”.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4425","Почему два одинаковых литерала не равны","why-two-identical-literals-are-not-equal",{"id":25,"value":26,"isTypeParagraph":8},"10185","При записи двух литералов создаются два разных экземпляра, даже если поля и значения выглядят одинаково:\n\n```\nconst a = { x: 1, y: 2 };\nconst b = { x: 1, y: 2 };\n\nconsole.log(a === b); // false\nconsole.log(a == b);  // false\n```\n\nЭто происходит потому, что сравнение объектов с помощью `===` возвращает `true` только если оба операнда указывают на один и тот же объект.\nТо есть сравнивается “идентичность” (reference identity), а не структура.\n\nДля контраста: одна и та же ссылка сравнивается как равная самой себе:\n\n```\nconst a = { x: 1 };\nconst alias = a;\n\nconsole.log(a === alias); // true\n```",{"id":28,"description":29,"titleAlert":19,"isTypeAlertInfo":8},"661","Формулировка “сравнение по ссылке” полезна как учебная модель: переменная “держит” не сам объект целиком, а ссылку на него.",{"id":31,"value":32,"anchor":33,"isTypeH2":8},"4426","Разбор вариантов 1–4","analysis-of-options-1-4",{"id":35,"value":36,"isTypeParagraph":8},"10186","| Вариант | Верно | Почему |\n|---|---|---|\n| 1 | Нет | `===` для объектов не “всегда false”: при сравнении одной и той же ссылки получается `true` (пример с `alias`). |\n| 2 | Нет | JavaScript не делает объекты “разными” из‑за сортировки ключей при создании; даже при одинаковом порядке ключей два литерала остаются разными экземплярами, и `===` всё равно даст `false`. |\n| 3 | Нет | `===` не сравнивает “количество свойств”; для объектов он проверяет идентичность ссылки, поэтому результат предсказуем: либо один и тот же объект (`true`), либо разные (`false`). |\n| 4 | Да | `===` для объектов — это сравнение ссылок; два одинаковых литерала создают два объекта → `false`. |",{"id":38,"value":39,"anchor":40,"isTypeH2":8},"4427","Как сравнивать объекты “по содержимому”","how-to-compare-objects-by-content",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4441","Поверхностное сравнение (shallow)","shallow-comparison",{"id":46,"value":47,"isTypeParagraph":8},"10187","Подходит, если объект плоский (значения — примитивы) и требуется сравнить только верхний уровень:\n\n```\nfunction shallowEqual(a, b) {\n  if (a === b) return true;\n  if (a == null || b == null) return false;\n  if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  if (aKeys.length !== bKeys.length) return false;\n\n  for (const k of aKeys) {\n    if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n    if (a[k] !== b[k]) return false;\n  }\n  return true;\n}\n\nconsole.log(shallowEqual({x: 1, y: 2}, {x: 1, y: 2})); // true\nconsole.log(shallowEqual({x: {z: 1}}, {x: {z: 1}}));   // false (вложенный объект сравнивается по ссылке)\n```",{"id":49,"value":50,"anchor":51,"isTypeH3":8},"4442","Глубокое сравнение (deep)","deep-comparison",{"id":53,"value":54,"isTypeParagraph":8},"10188","Нужно, если есть вложенные объекты/массивы:\n\n```\nfunction deepEqual(a, b) {\n  if (a === b) return true;\n\n  if (a == null || b == null) return false;\n  if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n  // массивы и обычные объекты обрабатываются отдельно\n  const aIsArray = Array.isArray(a);\n  const bIsArray = Array.isArray(b);\n  if (aIsArray !== bIsArray) return false;\n\n  if (aIsArray) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i \u003C a.length; i++) {\n      if (!deepEqual(a[i], b[i])) return false;\n    }\n    return true;\n  }\n\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  if (aKeys.length !== bKeys.length) return false;\n\n  for (const k of aKeys) {\n    if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n    if (!deepEqual(a[k], b[k])) return false;\n  }\n  return true;\n}\n\nconsole.log(deepEqual({x: {z: 1}}, {x: {z: 1}})); // true\nconsole.log(deepEqual([1, [2, 3]], [1, [2, 3]])); // true\n```",{"id":56,"description":57,"titleAlert":19,"isTypeAlertWarning":8},"722","Полное “правильное” глубокое сравнение в реальных проектах сложнее: встречаются `Date`, `Map`, `Set`, `RegExp`, циклические ссылки, разные прототипы, `NaN`, функции. Поэтому часто применяются готовые библиотеки или явно задаётся правило сравнения под конкретную задачу.",{"id":59,"value":60,"anchor":61,"isTypeH3":8},"4443","Сравнение через JSON (когда допустимо)","json-stringify-comparison",{"id":63,"value":64,"isTypeParagraph":8},"10189","Иногда используется при простых данных (без функций, `undefined`, циклов), но есть ограничения:\n\n```\nconst a = { a: 1, b: 2 };\nconst b = { b: 2, a: 1 };\n\nconsole.log(JSON.stringify(a) === JSON.stringify(b)); // может быть false из-за порядка ключей\n```\n",{"id":66,"description":67,"titleAlert":19,"isTypeAlertWarning":8},"723","`JSON.stringify` не сериализует функции и пропускает некоторые значения (например, `undefined` в объектах), поэтому “равенство строк JSON” не является универсальной проверкой равенства объектов.",{"id":69,"value":70,"anchor":71,"isTypeH2":8},"4428","Схема: что сравнивает ===","what-strict-equality-compares",{"id":73,"value":74,"isTypeParagraph":8},"10190","```\nПеременная a  ──►  [ объект #1: {x:1, y:2} ]\nПеременная b  ──►  [ объект #2: {x:1, y:2} ]\n\na === b  → сравнение ссылок:\n(ссылка на #1) === (ссылка на #2)  → false\n```",{"id":76,"description":77,"titleAlert":19,"isTypeAlertInfo":8},"662","Это же правило относится к массивам и функциям: `[] === []` → `false`, `(() => {}) === (() => {})` → `false`.",{"id":79,"value":80,"isTypeParagraph":8},"10191","Итого: оператор `===` для объектов проверяет идентичность ссылки, поэтому два отдельно созданных литерала не равны; правильный вариант ответа — 4, а для сравнения “по содержимому” требуется отдельный алгоритм (поверхностный или глубокий) либо библиотека.",{"id":82,"options":83,"hint":97,"solution":98,"description":99},"1155",[84,88,91,94],{"id":85,"label":86,"isCorrect":87},"4764","Потому что `===` для объектов всегда возвращает `false` по спецификации, даже если сравнивается одна и та же переменная.",false,{"id":89,"label":90,"isCorrect":87},"4765","Потому что JavaScript автоматически сортирует ключи объектов при создании, из-за чего одинаковые объекты становятся разными при сравнении.",{"id":92,"label":93,"isCorrect":87},"4766","Потому что при сравнении объектов `===` сравнивает только количество свойств, а не их значения, поэтому результат всегда непредсказуем.",{"id":95,"label":96,"isCorrect":8},"4767","Потому что объекты сравниваются по ссылке (идентичности экземпляра), а не по совпадению свойств; два одинаковых литерала создают разные объекты и дают `false`.","Если сравниваются два объекта, сначала следует мысленно ответить на вопрос: “это один и тот же экземпляр или два разных экземпляра с одинаковыми полями?” — для `===` важно только первое.","**Правильный ответ: 4** - объекты сравниваются по ссылке (идентичности экземпляра), а не по совпадению свойств; два одинаковых литерала создают разные объекты и дают `false`.\n","Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","quizQuestion",{"title":102,"description":103,"ogTitle":7,"ogDescription":103,"ogImageUrl":104,"canonical":19,"ogLocale":105,"ogSiteName":106,"ogImageType":107,"ogImageWidth":108,"ogImageHeight":109,"ogType":110,"ogUrl":19},"Почему два одинаковых объекта в JS сравниваются как false","Разбор сравнения по ссылке, отличие от сравнения значений, примеры и способы корректно сравнивать объекты","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":112,"siteUrl":113},"GOOD WEB JOB!","https://goodwebjob.ru",[115],{"label":116,"slug":117,"to":118},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":120,"navigationSublist":128},[121,124],{"path":118,"isActive":87,"name":122,"icon":123,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":125,"isActive":8,"name":126,"icon":127,"isNavbarMobileDisabled":87},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[129,138,165,177,183,323,347,356,362,425,446,452],{"title":130,"list":131,"isOpened":87},"Bash",[132,135],{"name":133,"path":134,"isActive":87},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":136,"path":137,"isActive":87},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":139,"list":140,"isOpened":87},"CSS",[141,144,147,150,153,156,159,162],{"name":142,"path":143,"isActive":87},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":145,"path":146,"isActive":87},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":148,"path":149,"isActive":87},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":151,"path":152,"isActive":87},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":154,"path":155,"isActive":87},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":157,"path":158,"isActive":87},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":160,"path":161,"isActive":87},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":163,"path":164,"isActive":87},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":166,"list":167,"isOpened":87},"Git",[168,171,174],{"name":169,"path":170,"isActive":87},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/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":172,"path":173,"isActive":87},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":175,"path":176,"isActive":87},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":178,"list":179,"isOpened":87},"HTML",[180],{"name":181,"path":182,"isActive":87},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":184,"list":185,"isOpened":87},"JavaScript",[186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,263,266,269,272,275,278,281,284,287,290,293,296,299,302,305,308,311,314,317,320],{"name":187,"path":188,"isActive":87},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":190,"path":191,"isActive":87},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":193,"path":194,"isActive":87},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":196,"path":197,"isActive":87},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":199,"path":200,"isActive":87},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":202,"path":203,"isActive":87},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":205,"path":206,"isActive":87},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":208,"path":209,"isActive":87},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":211,"path":212,"isActive":87},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":214,"path":215,"isActive":87},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":217,"path":218,"isActive":87},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":220,"path":221,"isActive":87},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":223,"path":224,"isActive":87},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":226,"path":227,"isActive":87},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":229,"path":230,"isActive":87},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":232,"path":233,"isActive":87},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":235,"path":236,"isActive":87},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":238,"path":239,"isActive":87},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":241,"path":242,"isActive":87},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":244,"path":245,"isActive":87},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":247,"path":248,"isActive":87},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":250,"path":251,"isActive":87},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":253,"path":254,"isActive":87},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":256,"path":257,"isActive":87},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":259,"path":260,"isActive":87},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":99,"path":262,"isActive":87},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":264,"path":265,"isActive":87},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":267,"path":268,"isActive":87},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":270,"path":271,"isActive":87},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":273,"path":274,"isActive":87},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":276,"path":277,"isActive":87},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":279,"path":280,"isActive":87},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":282,"path":283,"isActive":87},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":285,"path":286,"isActive":87},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":288,"path":289,"isActive":87},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":291,"path":292,"isActive":87},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":294,"path":295,"isActive":87}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":297,"path":298,"isActive":87},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":300,"path":301,"isActive":87},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":303,"path":304,"isActive":87},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":306,"path":307,"isActive":87},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":309,"path":310,"isActive":87},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":312,"path":313,"isActive":87},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":315,"path":316,"isActive":87},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":318,"path":319,"isActive":87},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":321,"path":322,"isActive":87},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":324,"list":325,"isOpened":87},"React",[326,329,332,335,338,341,344],{"name":327,"path":328,"isActive":87},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":330,"path":331,"isActive":87},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":333,"path":334,"isActive":87},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":336,"path":337,"isActive":87},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":339,"path":340,"isActive":87},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":342,"path":343,"isActive":87},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":345,"path":346,"isActive":87},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/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":348,"list":349,"isOpened":87},"Алгоритмы",[350,353],{"name":351,"path":352,"isActive":87},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":354,"path":355,"isActive":87},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":357,"list":358,"isOpened":87},"Дебаггинг",[359],{"name":360,"path":361,"isActive":87},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/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":363,"list":364,"isOpened":87},"Компьютерные сети",[365,368,371,374,377,380,383,386,389,392,395,398,401,404,407,410,413,416,419,422],{"name":366,"path":367,"isActive":87},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":369,"path":370,"isActive":87},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":372,"path":373,"isActive":87},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":375,"path":376,"isActive":87},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":378,"path":379,"isActive":87},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":381,"path":382,"isActive":87},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":384,"path":385,"isActive":87},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":387,"path":388,"isActive":87},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":390,"path":391,"isActive":87},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":393,"path":394,"isActive":87},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":396,"path":397,"isActive":87},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":399,"path":400,"isActive":87},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/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":402,"path":403,"isActive":87},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":405,"path":406,"isActive":87},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":408,"path":409,"isActive":87},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":411,"path":412,"isActive":87},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/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":414,"path":415,"isActive":87},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":417,"path":418,"isActive":87},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":420,"path":421,"isActive":87},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":423,"path":424,"isActive":87},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":426,"list":427,"isOpened":87},"Отрисовка в браузере",[428,431,434,437,440,443],{"name":429,"path":430,"isActive":87},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":432,"path":433,"isActive":87},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":435,"path":436,"isActive":87},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":438,"path":439,"isActive":87},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":441,"path":442,"isActive":87},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":444,"path":445,"isActive":87},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":447,"list":448,"isOpened":87},"Ревью кода",[449],{"name":450,"path":451,"isActive":87},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":453,"list":454,"isOpened":87},"Теория вероятности",[455,458,461],{"name":456,"path":457,"isActive":87},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/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":459,"path":460,"isActive":87},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/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":462,"path":463,"isActive":87},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":465},[466,469,471,473,475,478,481,483,485,487,489,491,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,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669,671,673,675,676,678,680,682,684],{"name":467,"value":468},"Теоретические задания","theoretical-tasks",{"name":223,"value":470},"what-this-code-will-return-typeof-function",{"name":122,"value":472},"where-to-begin",{"name":190,"value":474},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":476,"value":477},"Backend","backend",{"name":479,"value":480},"Frontend","frontend",{"name":187,"value":482},"prototype-what-logical-values-will-be-received-in-console-log",{"name":303,"value":484},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":294,"value":486},"find-non-repeating-numbers-in-an-array",{"name":267,"value":488},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":273,"value":490},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":492,"value":493},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":279,"value":495},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":196,"value":497},"what-value-will-the-console-output-with-object-property",{"name":199,"value":499},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":270,"value":501},"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":300,"value":503},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":306,"value":505},"determines-whether-a-word-is-a-palindrome",{"name":285,"value":507},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":312,"value":509},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":276,"value":511},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":282,"value":513},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":288,"value":515},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":321,"value":517},"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":291,"value":519},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":297,"value":521},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":202,"value":523},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":205,"value":525},"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":217,"value":527},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":220,"value":529},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":318,"value":531},"unifying-values-in-an-array",{"name":309,"value":533},"flattening-the-array",{"name":208,"value":535},"what-will-the-book-get-upper-name-method-return",{"name":315,"value":537},"string-compression",{"name":214,"value":539},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":226,"value":541},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":366,"value":543},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":372,"value":545},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":375,"value":547},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":378,"value":549},"key-differences-between-tcp-and-udp",{"name":381,"value":551},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":384,"value":553},"what-is-http-and-what-does-it-consist-of",{"name":387,"value":555},"what-are-http-headers-and-why-do-we-need-them",{"name":390,"value":557},"what-are-http-parameters",{"name":393,"value":559},"where-is-the-html-code-located-in-the-http-response-structure",{"name":181,"value":561},"what-is-html",{"name":396,"value":563},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":399,"value":565},"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":402,"value":567},"what-is-a-cookie",{"name":405,"value":569},"who-initiates-the-cookie-recording-in-the-browser",{"name":408,"value":571},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":573,"value":574},"Лайвкодинг","livecoding",{"name":193,"value":576},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":414,"value":578},"is-everything-that-goes-through-https-secure",{"name":417,"value":580},"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":420,"value":582},"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":432,"value":584},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":429,"value":586},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":435,"value":588},"what-is-blocking-the-page-rendering-in-the-browser",{"name":438,"value":590},"what-is-dom-in-a-browser-what-is-cssom",{"name":441,"value":592},"what-are-nodes-in-the-dom",{"name":444,"value":594},"what-does-cssom-consist-of",{"name":142,"value":596},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":145,"value":598},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":148,"value":600},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":151,"value":602},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":154,"value":604},"there-is-an-html-code-will-font-weight-affect-span",{"name":157,"value":606},"what-are-the-differences-between-flexbox-and-grid",{"name":160,"value":608},"do-flexbox-and-grid-replace-each-other",{"name":163,"value":610},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":126,"value":612},"tasks",{"name":229,"value":614},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":232,"value":616},"what-is-this-in-javascript",{"name":235,"value":618},"what-is-an-event-loop-and-how-does-it-work",{"name":238,"value":620},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":241,"value":622},"what-does-the-typeof-operator-show-in-javascript",{"name":244,"value":624},"what-types-of-data-exist-in-javascript",{"name":247,"value":626},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":250,"value":628},"what-will-typeof-return-for-an-array",{"name":253,"value":630},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":256,"value":632},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":259,"value":634},"what-does-typeof-return-for-new-set-in-javascript",{"name":327,"value":636},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":333,"value":638},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":336,"value":640},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":339,"value":642},"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":342,"value":644},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":360,"value":646},"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":169,"value":648},"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":172,"value":650},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":175,"value":652},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":450,"value":654},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":133,"value":656},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":136,"value":658},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":351,"value":660},"what-is-algorithmic-complexity",{"name":354,"value":662},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":99,"value":664},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":423,"value":666},"how-can-a-user-be-authorized-on-a-website",{"name":264,"value":668},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":456,"value":670},"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":459,"value":672},"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":462,"value":674},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":116,"value":117},{"name":411,"value":677},"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":369,"value":679},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":211,"value":681},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":330,"value":683},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":345,"value":685},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":687,"copyright":690,"reportError":691,"socialNetwork":693},{"link":688,"title":689},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":692,"link":688},"Сообщить об ошибке",{"label":694,"socialNetworkList":695},"Мы в соцсетях:",[696,699,702],{"icon":19,"link":697,"title":698},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":700,"link":688,"title":701},"ic:baseline-telegram","Telegram",{"icon":703,"link":704,"title":705},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":707,"body":708},{},{"type":709,"children":710},"root",[711],{"type":712,"tag":713,"props":714,"children":715},"element","p",{},[716],{"type":717,"value":99},"text",{"data":719,"body":720},{},{"type":709,"children":721},[722],{"type":712,"tag":713,"props":723,"children":724},{},[725,727,734,736,742],{"type":717,"value":726},"Потому что ",{"type":712,"tag":728,"props":729,"children":731},"code",{"className":730},[],[732],{"type":717,"value":733},"===",{"type":717,"value":735}," для объектов всегда возвращает ",{"type":712,"tag":728,"props":737,"children":739},{"className":738},[],[740],{"type":717,"value":741},"false",{"type":717,"value":743}," по спецификации, даже если сравнивается одна и та же переменная.",{"data":745,"body":746},{},{"type":709,"children":747},[748],{"type":712,"tag":713,"props":749,"children":750},{},[751],{"type":717,"value":90},{"data":753,"body":754},{},{"type":709,"children":755},[756],{"type":712,"tag":713,"props":757,"children":758},{},[759,761,766],{"type":717,"value":760},"Потому что при сравнении объектов ",{"type":712,"tag":728,"props":762,"children":764},{"className":763},[],[765],{"type":717,"value":733},{"type":717,"value":767}," сравнивает только количество свойств, а не их значения, поэтому результат всегда непредсказуем.",{"data":769,"body":770},{},{"type":709,"children":771},[772],{"type":712,"tag":713,"props":773,"children":774},{},[775,777,782],{"type":717,"value":776},"Потому что объекты сравниваются по ссылке (идентичности экземпляра), а не по совпадению свойств; два одинаковых литерала создают разные объекты и дают ",{"type":712,"tag":728,"props":778,"children":780},{"className":779},[],[781],{"type":717,"value":741},{"type":717,"value":783},".",{"data":785,"body":786},{},{"type":709,"children":787},[788],{"type":712,"tag":713,"props":789,"children":790},{},[791,793,798],{"type":717,"value":792},"Если сравниваются два объекта, сначала следует мысленно ответить на вопрос: “это один и тот же экземпляр или два разных экземпляра с одинаковыми полями?” — для ",{"type":712,"tag":728,"props":794,"children":796},{"className":795},[],[797],{"type":717,"value":733},{"type":717,"value":799}," важно только первое.",{"data":801,"body":802},{},{"type":709,"children":803},[804],{"type":712,"tag":713,"props":805,"children":806},{},[807,813,815,820],{"type":712,"tag":808,"props":809,"children":810},"strong",{},[811],{"type":717,"value":812},"Правильный ответ: 4",{"type":717,"value":814}," - объекты сравниваются по ссылке (идентичности экземпляра), а не по совпадению свойств; два одинаковых литерала создают разные объекты и дают ",{"type":712,"tag":728,"props":816,"children":818},{"className":817},[],[819],{"type":717,"value":741},{"type":717,"value":783},{"data":822,"body":823},{},{"type":709,"children":824},[825],{"type":712,"tag":713,"props":826,"children":827},{},[828,830,836,838,844,845,851,852,858,859,865,866,872,873,879,881,886,888,893],{"type":717,"value":829},"В JavaScript значения делятся на примитивы (например, ",{"type":712,"tag":728,"props":831,"children":833},{"className":832},[],[834],{"type":717,"value":835},"number",{"type":717,"value":837},", ",{"type":712,"tag":728,"props":839,"children":841},{"className":840},[],[842],{"type":717,"value":843},"string",{"type":717,"value":837},{"type":712,"tag":728,"props":846,"children":848},{"className":847},[],[849],{"type":717,"value":850},"boolean",{"type":717,"value":837},{"type":712,"tag":728,"props":853,"children":855},{"className":854},[],[856],{"type":717,"value":857},"null",{"type":717,"value":837},{"type":712,"tag":728,"props":860,"children":862},{"className":861},[],[863],{"type":717,"value":864},"undefined",{"type":717,"value":837},{"type":712,"tag":728,"props":867,"children":869},{"className":868},[],[870],{"type":717,"value":871},"bigint",{"type":717,"value":837},{"type":712,"tag":728,"props":874,"children":876},{"className":875},[],[877],{"type":717,"value":878},"symbol",{"type":717,"value":880},") и объекты (в том числе массивы, функции, даты).\nДля примитивов сравнение ",{"type":712,"tag":728,"props":882,"children":884},{"className":883},[],[885],{"type":717,"value":733},{"type":717,"value":887}," обычно означает “одно и то же значение”, а для объектов ",{"type":712,"tag":728,"props":889,"children":891},{"className":890},[],[892],{"type":717,"value":733},{"type":717,"value":894}," означает “одна и та же ссылка (тот же самый объект в памяти)”.",{"data":896,"body":897},{},{"type":709,"children":898},[899],{"type":712,"tag":713,"props":900,"children":901},{},[902,904,909],{"type":717,"value":903},"Сравнение объектов “по содержимому” (чтобы совпадали все поля и их значения) не является задачей оператора ",{"type":712,"tag":728,"props":905,"children":907},{"className":906},[],[908],{"type":717,"value":733},{"type":717,"value":910},"; для этого нужны отдельные алгоритмы “глубокого сравнения”.",{"data":912,"body":913},{},{"type":709,"children":914},[915,920,932,952,957],{"type":712,"tag":713,"props":916,"children":917},{},[918],{"type":717,"value":919},"При записи двух литералов создаются два разных экземпляра, даже если поля и значения выглядят одинаково:",{"type":712,"tag":921,"props":922,"children":926},"pre",{"className":923,"code":925,"language":717},[924],"language-text","const a = { x: 1, y: 2 };\nconst b = { x: 1, y: 2 };\n\nconsole.log(a === b); // false\nconsole.log(a == b);  // false\n",[927],{"type":712,"tag":728,"props":928,"children":930},{"__ignoreMap":929},"",[931],{"type":717,"value":925},{"type":712,"tag":713,"props":933,"children":934},{},[935,937,942,944,950],{"type":717,"value":936},"Это происходит потому, что сравнение объектов с помощью ",{"type":712,"tag":728,"props":938,"children":940},{"className":939},[],[941],{"type":717,"value":733},{"type":717,"value":943}," возвращает ",{"type":712,"tag":728,"props":945,"children":947},{"className":946},[],[948],{"type":717,"value":949},"true",{"type":717,"value":951}," только если оба операнда указывают на один и тот же объект.\nТо есть сравнивается “идентичность” (reference identity), а не структура.",{"type":712,"tag":713,"props":953,"children":954},{},[955],{"type":717,"value":956},"Для контраста: одна и та же ссылка сравнивается как равная самой себе:",{"type":712,"tag":921,"props":958,"children":961},{"className":959,"code":960,"language":717},[924],"const a = { x: 1 };\nconst alias = a;\n\nconsole.log(a === alias); // true\n",[962],{"type":712,"tag":728,"props":963,"children":964},{"__ignoreMap":929},[965],{"type":717,"value":960},{"data":967,"body":968},{},{"type":709,"children":969},[970],{"type":712,"tag":713,"props":971,"children":972},{},[973],{"type":717,"value":29},{"data":975,"body":976},{},{"type":709,"children":977},[978],{"type":712,"tag":979,"props":980,"children":981},"table",{},[982,1006],{"type":712,"tag":983,"props":984,"children":985},"thead",{},[986],{"type":712,"tag":987,"props":988,"children":989},"tr",{},[990,996,1001],{"type":712,"tag":991,"props":992,"children":993},"th",{},[994],{"type":717,"value":995},"Вариант",{"type":712,"tag":991,"props":997,"children":998},{},[999],{"type":717,"value":1000},"Верно",{"type":712,"tag":991,"props":1002,"children":1003},{},[1004],{"type":717,"value":1005},"Почему",{"type":712,"tag":1007,"props":1008,"children":1009},"tbody",{},[1010,1049,1079,1114],{"type":712,"tag":987,"props":1011,"children":1012},{},[1013,1019,1024],{"type":712,"tag":1014,"props":1015,"children":1016},"td",{},[1017],{"type":717,"value":1018},"1",{"type":712,"tag":1014,"props":1020,"children":1021},{},[1022],{"type":717,"value":1023},"Нет",{"type":712,"tag":1014,"props":1025,"children":1026},{},[1027,1032,1034,1039,1041,1047],{"type":712,"tag":728,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":717,"value":733},{"type":717,"value":1033}," для объектов не “всегда false”: при сравнении одной и той же ссылки получается ",{"type":712,"tag":728,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":717,"value":949},{"type":717,"value":1040}," (пример с ",{"type":712,"tag":728,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":717,"value":1046},"alias",{"type":717,"value":1048},").",{"type":712,"tag":987,"props":1050,"children":1051},{},[1052,1057,1061],{"type":712,"tag":1014,"props":1053,"children":1054},{},[1055],{"type":717,"value":1056},"2",{"type":712,"tag":1014,"props":1058,"children":1059},{},[1060],{"type":717,"value":1023},{"type":712,"tag":1014,"props":1062,"children":1063},{},[1064,1066,1071,1073,1078],{"type":717,"value":1065},"JavaScript не делает объекты “разными” из‑за сортировки ключей при создании; даже при одинаковом порядке ключей два литерала остаются разными экземплярами, и ",{"type":712,"tag":728,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":717,"value":733},{"type":717,"value":1072}," всё равно даст ",{"type":712,"tag":728,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":717,"value":741},{"type":717,"value":783},{"type":712,"tag":987,"props":1080,"children":1081},{},[1082,1087,1091],{"type":712,"tag":1014,"props":1083,"children":1084},{},[1085],{"type":717,"value":1086},"3",{"type":712,"tag":1014,"props":1088,"children":1089},{},[1090],{"type":717,"value":1023},{"type":712,"tag":1014,"props":1092,"children":1093},{},[1094,1099,1101,1106,1108,1113],{"type":712,"tag":728,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":717,"value":733},{"type":717,"value":1100}," не сравнивает “количество свойств”; для объектов он проверяет идентичность ссылки, поэтому результат предсказуем: либо один и тот же объект (",{"type":712,"tag":728,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":717,"value":949},{"type":717,"value":1107},"), либо разные (",{"type":712,"tag":728,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":717,"value":741},{"type":717,"value":1048},{"type":712,"tag":987,"props":1115,"children":1116},{},[1117,1122,1127],{"type":712,"tag":1014,"props":1118,"children":1119},{},[1120],{"type":717,"value":1121},"4",{"type":712,"tag":1014,"props":1123,"children":1124},{},[1125],{"type":717,"value":1126},"Да",{"type":712,"tag":1014,"props":1128,"children":1129},{},[1130,1135,1137,1142],{"type":712,"tag":728,"props":1131,"children":1133},{"className":1132},[],[1134],{"type":717,"value":733},{"type":717,"value":1136}," для объектов — это сравнение ссылок; два одинаковых литерала создают два объекта → ",{"type":712,"tag":728,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":717,"value":741},{"type":717,"value":783},{"data":1144,"body":1145},{},{"type":709,"children":1146},[1147,1152],{"type":712,"tag":713,"props":1148,"children":1149},{},[1150],{"type":717,"value":1151},"Подходит, если объект плоский (значения — примитивы) и требуется сравнить только верхний уровень:",{"type":712,"tag":921,"props":1153,"children":1156},{"className":1154,"code":1155,"language":717},[924],"function shallowEqual(a, b) {\n  if (a === b) return true;\n  if (a == null || b == null) return false;\n  if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  if (aKeys.length !== bKeys.length) return false;\n\n  for (const k of aKeys) {\n    if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n    if (a[k] !== b[k]) return false;\n  }\n  return true;\n}\n\nconsole.log(shallowEqual({x: 1, y: 2}, {x: 1, y: 2})); // true\nconsole.log(shallowEqual({x: {z: 1}}, {x: {z: 1}}));   // false (вложенный объект сравнивается по ссылке)\n",[1157],{"type":712,"tag":728,"props":1158,"children":1159},{"__ignoreMap":929},[1160],{"type":717,"value":1155},{"data":1162,"body":1163},{},{"type":709,"children":1164},[1165,1170],{"type":712,"tag":713,"props":1166,"children":1167},{},[1168],{"type":717,"value":1169},"Нужно, если есть вложенные объекты/массивы:",{"type":712,"tag":921,"props":1171,"children":1174},{"className":1172,"code":1173,"language":717},[924],"function deepEqual(a, b) {\n  if (a === b) return true;\n\n  if (a == null || b == null) return false;\n  if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n  // массивы и обычные объекты обрабатываются отдельно\n  const aIsArray = Array.isArray(a);\n  const bIsArray = Array.isArray(b);\n  if (aIsArray !== bIsArray) return false;\n\n  if (aIsArray) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i \u003C a.length; i++) {\n      if (!deepEqual(a[i], b[i])) return false;\n    }\n    return true;\n  }\n\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  if (aKeys.length !== bKeys.length) return false;\n\n  for (const k of aKeys) {\n    if (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n    if (!deepEqual(a[k], b[k])) return false;\n  }\n  return true;\n}\n\nconsole.log(deepEqual({x: {z: 1}}, {x: {z: 1}})); // true\nconsole.log(deepEqual([1, [2, 3]], [1, [2, 3]])); // true\n",[1175],{"type":712,"tag":728,"props":1176,"children":1177},{"__ignoreMap":929},[1178],{"type":717,"value":1173},{"data":1180,"body":1181},{},{"type":709,"children":1182},[1183],{"type":712,"tag":713,"props":1184,"children":1185},{},[1186,1188,1194,1195,1201,1202,1208,1209,1215,1217,1223],{"type":717,"value":1187},"Полное “правильное” глубокое сравнение в реальных проектах сложнее: встречаются ",{"type":712,"tag":728,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":717,"value":1193},"Date",{"type":717,"value":837},{"type":712,"tag":728,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":717,"value":1200},"Map",{"type":717,"value":837},{"type":712,"tag":728,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":717,"value":1207},"Set",{"type":717,"value":837},{"type":712,"tag":728,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":717,"value":1214},"RegExp",{"type":717,"value":1216},", циклические ссылки, разные прототипы, ",{"type":712,"tag":728,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":717,"value":1222},"NaN",{"type":717,"value":1224},", функции. Поэтому часто применяются готовые библиотеки или явно задаётся правило сравнения под конкретную задачу.",{"data":1226,"body":1227},{},{"type":709,"children":1228},[1229,1241],{"type":712,"tag":713,"props":1230,"children":1231},{},[1232,1234,1239],{"type":717,"value":1233},"Иногда используется при простых данных (без функций, ",{"type":712,"tag":728,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":717,"value":864},{"type":717,"value":1240},", циклов), но есть ограничения:",{"type":712,"tag":921,"props":1242,"children":1245},{"className":1243,"code":1244,"language":717},[924],"const a = { a: 1, b: 2 };\nconst b = { b: 2, a: 1 };\n\nconsole.log(JSON.stringify(a) === JSON.stringify(b)); // может быть false из-за порядка ключей\n",[1246],{"type":712,"tag":728,"props":1247,"children":1248},{"__ignoreMap":929},[1249],{"type":717,"value":1244},{"data":1251,"body":1252},{},{"type":709,"children":1253},[1254],{"type":712,"tag":713,"props":1255,"children":1256},{},[1257,1263,1265,1270],{"type":712,"tag":728,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":717,"value":1262},"JSON.stringify",{"type":717,"value":1264}," не сериализует функции и пропускает некоторые значения (например, ",{"type":712,"tag":728,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":717,"value":864},{"type":717,"value":1271}," в объектах), поэтому “равенство строк JSON” не является универсальной проверкой равенства объектов.",{"data":1273,"body":1274},{},{"type":709,"children":1275},[1276],{"type":712,"tag":921,"props":1277,"children":1280},{"className":1278,"code":1279,"language":717},[924],"Переменная a  ──►  [ объект #1: {x:1, y:2} ]\nПеременная b  ──►  [ объект #2: {x:1, y:2} ]\n\na === b  → сравнение ссылок:\n(ссылка на #1) === (ссылка на #2)  → false\n",[1281],{"type":712,"tag":728,"props":1282,"children":1283},{"__ignoreMap":929},[1284],{"type":717,"value":1279},{"data":1286,"body":1287},{},{"type":709,"children":1288},[1289],{"type":712,"tag":713,"props":1290,"children":1291},{},[1292,1294,1300,1302,1307,1308,1314,1315,1320],{"type":717,"value":1293},"Это же правило относится к массивам и функциям: ",{"type":712,"tag":728,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":717,"value":1299},"[] === []",{"type":717,"value":1301}," → ",{"type":712,"tag":728,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":717,"value":741},{"type":717,"value":837},{"type":712,"tag":728,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":717,"value":1313},"(() => {}) === (() => {})",{"type":717,"value":1301},{"type":712,"tag":728,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":717,"value":741},{"type":717,"value":783},{"data":1322,"body":1323},{},{"type":709,"children":1324},[1325],{"type":712,"tag":713,"props":1326,"children":1327},{},[1328,1330,1335],{"type":717,"value":1329},"Итого: оператор ",{"type":712,"tag":728,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":717,"value":733},{"type":717,"value":1336}," для объектов проверяет идентичность ссылки, поэтому два отдельно созданных литерала не равны; правильный вариант ответа — 4, а для сравнения “по содержимому” требуется отдельный алгоритм (поверхностный или глубокий) либо библиотека.",1775735658903]