[{"data":1,"prerenderedAt":2491},["ShallowReactive",2],{"$fuK9YpFu7S-qQnzo336n6C5zjWNriAB4iTtK3MiWVB0Q":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":187,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":190,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":195,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":540,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":762,"mdc--ap77t0-key":782,"mdc-ayajfc-key":794,"mdc--byvgp5-key":807,"mdc-oqyqr5-key":819,"mdc-y5uoas-key":831,"mdc-suhwcv-key":844,"mdc--whb1h4-key":856,"mdc--4rs9nt-key":868,"mdc-zg4gnw-key":881,"mdc-7qds4-key":912,"mdc-7dtsfb-key":1044,"mdc--2838bl-key":1060,"mdc-ehg4o1-key":1118,"mdc-id20pg-key":1134,"mdc-ju4lvg-key":1540,"mdc--a1jmyv-key":1589,"mdc-b4lip2-key":1609,"mdc--8kvgql-key":1622,"mdc-kjw5gr-key":1693,"mdc-9bb8p2-key":1741,"mdc--wy13pc-key":1758,"mdc--yb0duq-key":1771,"mdc-fniex-key":1844,"mdc-xde1k8-key":1905,"mdc-djyifl-key":1927,"mdc-j3xf0m-key":1940,"mdc--ogzwwp-key":1981,"mdc--8jum7a-key":1998,"mdc--di1zto-key":2060,"mdc-aig9a0-key":2115,"mdc-jf9aqz-key":2190,"mdc--enljkg-key":2229,"mdc--ezd53l-key":2237,"mdc-sck3e5-key":2250,"mdc-xzo0a3-key":2356,"mdc-4fylxs-key":2443,"mdc-opbv0n-key":2455,"mdc--swlwsn-key":2467,"mdc--vd7lr-key":2479},{"content":4,"quizQuestionContent":137,"type":176,"pageMeta":177},[5,9,13,16,20,24,27,31,34,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,111,114,118,121,124,127,131,134],{"id":6,"value":7,"isTypeH1":8},"1907","Какие типы данных существует в JavaScript?",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4375","Теория: какие типы данных есть в JavaScript","theory-js-data-types",{"id":14,"value":15,"isTypeParagraph":8},"10068","В спецификации ECMAScript значения делятся на примитивные типы и тип `object`. Примитивы представляют собой неделимые значения (число, строка и т.д.), а объекты — контейнеры со свойствами и поведением.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"641","Термин “тип данных” в JavaScript обычно означает именно эти 8 категорий значений: `undefined`, `null`, `boolean`, `number`, `bigint`, `string`, `symbol`, `object`.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4376","Схема: примитивы и объекты","diagram-primitives-vs-objects",{"id":25,"value":26,"isTypeParagraph":8},"10069","```\nЗначения JavaScript\n├─ Примитивы (7)\n│  ├─ undefined\n│  ├─ null\n│  ├─ boolean\n│  ├─ number\n│  ├─ bigint\n│  ├─ string\n│  └─ symbol\n└─ Object (1, непримитивный)\n   ├─ plain object {}\n   ├─ array []\n   ├─ function () {}\n   ├─ date new Date()\n   ├─ map/set new Map(), new Set()\n   └─ и другие встроенные/пользовательские объекты\n```",{"id":28,"value":29,"anchor":30,"isTypeH2":8},"4377","Короткая таблица: тип, typeof, пример","table-typeof-examples",{"id":32,"value":33,"isTypeParagraph":8},"10070","| Тип | Результат `typeof` | Пример значения | Важная особенность |\n|---|---|---|---|\n| `undefined` | `undefined` | `undefined` | “Значение отсутствует” (часто у неинициализированных переменных) |\n| `null` | `object` | `null` | Историческая особенность: `typeof null` возвращает `object` |\n| `boolean` | `boolean` | `true` | Только `true` и `false` |\n| `number` | `number` | `42`, `3.14`, `NaN` | Все обычные числа, включая `NaN`, `Infinity`, `-0` |\n| `bigint` | `bigint` | `9007199254740993n` | Целые числа произвольной длины, литерал с `n` |\n| `string` | `string` | `\"привет\"` | Строки в Unicode, отдельного `char` нет |\n| `symbol` | `symbol` | `Symbol(\"id\")` | Уникальные идентификаторы, часто для “скрытых” ключей |\n| `object` | `object` (или `function`) | `{}`, `[]`, `() => {}` | Объекты и функции (функции — вызываемые объекты) |",{"id":35,"value":36,"anchor":37,"isTypeH2":8},"4378","Разбор каждого типа с примерами","each-type-explained",{"id":39,"value":40,"anchor":40,"isTypeH3":8},"4390","undefined",{"id":42,"value":43,"isTypeParagraph":8},"10071","`undefined` означает, что значение не задано. Часто появляется у объявленной, но не инициализированной переменной, у отсутствующего свойства, а также как результат функции без `return`.\n\nПримеры: `let a;` и `typeof a`.\n\n```\nlet a;\nconsole.log(a);           // undefined\nconsole.log(typeof a);    // \"undefined\"\n\nconst obj = {};\nconsole.log(obj.missing); // undefined\n\nfunction f() {}\nconsole.log(f());         // undefined\n```\n",{"id":45,"description":46,"titleAlert":19,"isTypeAlertWarning":8},"699","`undefined` и “не существует” — не одно и то же: переменная может не существовать (ReferenceError), а может существовать и быть равной `undefined`.",{"id":48,"value":49,"isTypeParagraph":8},"10072","```\n// Пример различия (в модуле/строгом режиме будет ReferenceError)\nconsole.log(notDeclared); // ReferenceError: notDeclared is not defined\n\nlet declared;\nconsole.log(declared);    // undefined\n```\n",{"id":51,"value":52,"anchor":52,"isTypeH3":8},"4391","null",{"id":54,"value":55,"isTypeParagraph":8},"10073","`null` обычно означает “пустое значение по намерению”: объект отсутствует, ссылка очищена и т.п.\n\nПримеры: `const x = null;` и `x === null`.\n\n```\nconst x = null;\nconsole.log(x);             // null\nconsole.log(x === null);    // true\nconsole.log(typeof x);      // \"object\" (историческая особенность)\n```\n\nПрактическая проверка на “null или undefined” часто делается через `x == null`, потому что нестрогое равенство в этом месте намеренно устроено так, что `null == undefined` истинно.\n\n```\nconst a = null;\nconst b = undefined;\n\nconsole.log(a == null);      // true\nconsole.log(b == null);      // true\nconsole.log(a === null);     // true\nconsole.log(b === null);     // false\n```",{"id":57,"value":58,"anchor":58,"isTypeH3":8},"4392","boolean",{"id":60,"value":61,"isTypeParagraph":8},"10074","`boolean` содержит только два значения: `true` и `false`. В условиях выполняется приведение к булеву значению (truthy/falsy).\n\nПример: `Boolean(\"x\")`.\n\n```\nconsole.log(typeof true);         // \"boolean\"\nconsole.log(Boolean(0));          // false\nconsole.log(Boolean(\"\"));         // false\nconsole.log(Boolean(\"text\"));     // true\nconsole.log(Boolean([]));         // true\nconsole.log(Boolean({}));         // true\n```",{"id":63,"description":64,"titleAlert":19,"isTypeAlertWarning":8},"700","Объект-обертка `new Boolean(false)` является объектом и ведет себя как truthy в условиях, что часто вызывает ошибки.",{"id":66,"value":67,"isTypeParagraph":8},"10075","```\nconst b = new Boolean(false);\n\nconsole.log(typeof b); // \"object\"\nif (b) {\n  console.log(\"Сработает, потому что это объект\"); \n}\n```",{"id":69,"value":70,"anchor":70,"isTypeH3":8},"4393","number",{"id":72,"value":73,"isTypeParagraph":8},"10076","`number` — единственный “обычный” числовой тип: целые и дробные значения, а также специальные значения `NaN`, `Infinity`, `-Infinity`. В основе лежит формат IEEE 754 двойной точности, что объясняет ошибки округления.\n\nПримеры: `Number.isNaN(NaN)` и `0.1 + 0.2`.\n\n```\nconsole.log(typeof 123);        // \"number\"\nconsole.log(typeof 3.14);       // \"number\"\n\nconsole.log(0.1 + 0.2);         // 0.30000000000000004\nconsole.log(Number.isNaN(NaN)); // true\nconsole.log(NaN === NaN);       // false\n\nconsole.log(1 / 0);             // Infinity\nconsole.log(-1 / 0);            // -Infinity\nconsole.log(Object.is(-0, 0));  // false (в JS существуют +0 и -0)\n```\n\nДля денежных расчетов часто выбирается подход “хранить в целых минимальных единицах” (например, копейки) или использовать `bigint` там, где нужна целочисленная точность и нет дробной части.",{"id":75,"value":76,"anchor":76,"isTypeH3":8},"4394","bigint",{"id":78,"value":79,"isTypeParagraph":8},"10077","`bigint` предназначен для целых чисел произвольной длины. Литералы пишутся с суффиксом `n`. `bigint` не смешивается с `number` в арифметике без явного преобразования.\n\nПримеры: `9007199254740993n` и `typeof 1n`.\n\n```\nconst safeLimit = Number.MAX_SAFE_INTEGER; // 9007199254740991\nconsole.log(safeLimit + 1);                // 9007199254740992\nconsole.log(safeLimit + 2);                // 9007199254740992 (теряется точность)\n\nconst big = 9007199254740993n;\nconsole.log(big + 2n);                     // 9007199254740995n\nconsole.log(typeof big);                   // \"bigint\"\n```\n",{"id":81,"description":82,"titleAlert":19,"isTypeAlertWarning":8},"701","Операции между `number` и `bigint` выбрасывают ошибку TypeError.",{"id":84,"value":85,"isTypeParagraph":8},"10078","```\nconst a = 10n;\nconst b = 2;\n\n// console.log(a + b); // TypeError: Cannot mix BigInt and other types\n\nconsole.log(a + BigInt(b)); // 12n\nconsole.log(Number(a) + b); // 12 (возможна потеря точности при больших значениях)\n```",{"id":87,"value":88,"anchor":88,"isTypeH3":8},"4395","string",{"id":90,"value":91,"isTypeParagraph":8},"10079","`string` хранит текст. Отдельного типа “символ” нет: один символ — это строка длины 1. Строки являются неизменяемыми (immutable): изменение символа “внутри” строки невозможно, создается новая строка.\n\nПримеры: `\"a\".length` и `\"a\"[0]`.\n\n```\nconst s = \"hello\";\nconsole.log(typeof s);     // \"string\"\nconsole.log(s.length);     // 5\nconsole.log(s[0]);         // \"h\"\n\nconst t = \"h\" + \"i\";\nconsole.log(t);            // \"hi\"\n```",{"id":93,"description":94,"titleAlert":19,"isTypeAlertInfo":8},"642","Работа с “символами” Unicode может быть нетривиальной: некоторые визуальные символы занимают два 16-битных элемента (суррогатные пары), поэтому `length` не всегда равен числу видимых символов.",{"id":96,"value":97,"anchor":97,"isTypeH3":8},"4396","symbol",{"id":99,"value":100,"isTypeParagraph":8},"10080","`symbol` — уникальный примитив, чаще всего применяемый как ключ свойства, чтобы избежать конфликтов имен. Символы уникальны даже при одинаковом описании.\n\nПримеры: `Symbol(\"id\")` и `sym1 === sym2`.\n\n```\nconst sym1 = Symbol(\"id\");\nconst sym2 = Symbol(\"id\");\n\nconsole.log(typeof sym1);       // \"symbol\"\nconsole.log(sym1 === sym2);     // false\n\nconst user = {\n  name: \"Ann\",\n  [sym1]: 123\n};\n\nconsole.log(user.name);         // \"Ann\"\nconsole.log(user[sym1]);        // 123\nconsole.log(Object.keys(user)); // [\"name\"] (символьный ключ не перечисляется через keys)\n```\n\nСуществует глобальный реестр символов через `Symbol.for(\"key\")`, в котором одинаковый ключ возвращает один и тот же символ.\n\n```\nconst a = Symbol.for(\"shared\");\nconst b = Symbol.for(\"shared\");\nconsole.log(a === b); // true\n```",{"id":102,"value":103,"anchor":103,"isTypeH3":8},"4397","object",{"id":105,"value":106,"isTypeParagraph":8},"10081","`object` — непримитивный тип: значения имеют идентичность (ссылку), свойства и прототип. Сюда относятся обычные объекты, массивы, функции, даты, коллекции и пользовательские экземпляры классов.\n\nПримеры: `typeof {}` и `Array.isArray([])`.\n\n```\nconst obj = { a: 1 };\nconst arr = [1, 2, 3];\nfunction fn() {}\n\nconsole.log(typeof obj); // \"object\"\nconsole.log(typeof arr); // \"object\"\nconsole.log(typeof fn);  // \"function\"\n\nconsole.log(Array.isArray(arr)); // true\nconsole.log(arr instanceof Array); // true\n```\n\nКлючевая особенность объектов — сравнение по ссылке, а не по содержимому.\n\n```\nconst a = { x: 1 };\nconst b = { x: 1 };\nconst c = a;\n\nconsole.log(a === b); // false (разные объекты)\nconsole.log(a === c); // true  (одна и та же ссылка)\n```",{"id":108,"value":109,"anchor":110,"isTypeH2":8},"4379","Важные проверки типов на практике","practical-type-checking",{"id":112,"value":113,"isTypeParagraph":8},"10082","Оператор `typeof` полезен, но имеет нюансы. Для надежных проверок обычно комбинируются разные техники.\n\n```\n// typeof для примитивов\nconsole.log(typeof undefined); // \"undefined\"\nconsole.log(typeof null);      // \"object\" (нюанс)\nconsole.log(typeof true);      // \"boolean\"\nconsole.log(typeof 1);         // \"number\"\nconsole.log(typeof 1n);        // \"bigint\"\nconsole.log(typeof \"x\");       // \"string\"\nconsole.log(typeof Symbol());  // \"symbol\"\n\n// typeof для объектов\nconsole.log(typeof {});        // \"object\"\nconsole.log(typeof []);        // \"object\"\nconsole.log(typeof (() => {})); // \"function\"\n```\n\nДля различения “обычный объект vs массив vs дата” часто применяются:\n\n- `Array.isArray(value)` для массивов\n- `value instanceof Date` для дат (в рамках одного глобального контекста)\n- `Object.prototype.toString.call(value)` как более универсальный способ\n\n```\nfunction tagOf(v) {\n  return Object.prototype.toString.call(v);\n}\n\nconsole.log(tagOf([]));            // \"[object Array]\"\nconsole.log(tagOf({}));            // \"[object Object]\"\nconsole.log(tagOf(new Date()));    // \"[object Date]\"\nconsole.log(tagOf(null));          // \"[object Null]\"\nconsole.log(tagOf(undefined));     // \"[object Undefined]\"\n```",{"id":115,"value":116,"anchor":117,"isTypeH2":8},"4380","Примитивы vs объекты: копирование и изменение","primitives-vs-objects-copying",{"id":119,"value":120,"isTypeParagraph":8},"10083","Примитивные значения копируются “как значение”, а объекты передаются как ссылка на один и тот же объект. Это особенно важно при присваивании и передаче в функции.\n\n```\n// Примитив: копия значения\nlet a = 10;\nlet b = a;\nb = 20;\n\nconsole.log(a); // 10\nconsole.log(b); // 20\n\n// Объект: копия ссылки\nlet o1 = { count: 1 };\nlet o2 = o1;\no2.count = 2;\n\nconsole.log(o1.count); // 2\nconsole.log(o2.count); // 2\n```\n\nЧтобы получить “поверхностную” копию объекта, часто используется `structuredClone` (глубокая копия, где поддерживается) или комбинации вроде `Object.assign`/spread для поверхностной копии.",{"id":122,"description":123,"titleAlert":19,"isTypeAlertWarning":8},"702","Поверхностная копия не копирует вложенные объекты: вложенные ссылки остаются общими.",{"id":125,"value":126,"isTypeParagraph":8},"10084","```\nconst original = { inner: { x: 1 } };\nconst shallow = { ...original };\n\nshallow.inner.x = 999;\n\nconsole.log(original.inner.x); // 999 (вложенный объект общий)\n```",{"id":128,"value":129,"anchor":130,"isTypeH2":8},"4381","Частые ошибки начинающих","common-beginner-mistakes",{"id":132,"value":133,"isTypeParagraph":8},"10085","- Ожидание, что `null` даст `typeof null === \"null\"`, хотя фактически возвращается `\"object\"`\n- Попытка хранить “большие целые” в `number` без потери точности, хотя безопасный диапазон ограничен `Number.MAX_SAFE_INTEGER`\n- Смешивание `bigint` и `number` в арифметике без преобразования\n- Ожидание, что массив — отдельный тип, хотя он является объектом и проверяется через `Array.isArray`\n- Использование объектов-оберток `new Number(1)`, `new String(\"x\")`, `new Boolean(false)` вместо примитивов",{"id":135,"value":136,"isTypeParagraph":8},"10086","Кратко: В JavaScript существует 8 типов данных: 7 примитивов (`undefined`, `null`, `boolean`, `number`, `bigint`, `string`, `symbol`) и 1 непримитивный (`object`). Массивы и функции относятся к `object` (функции имеют `typeof === \"function\"`), а `typeof null` — историческое исключение, возвращающее `\"object\"`.",{"id":138,"options":139,"hint":174,"solution":175,"description":7},"1146",[140,143,146,150,153,156,159,162,165,168,171],{"id":141,"label":142,"isCorrect":8},"4722","`undefined`",{"id":144,"label":145,"isCorrect":8},"4723","`null`",{"id":147,"label":148,"isCorrect":149},"4724","`array`",false,{"id":151,"label":152,"isCorrect":8},"4725","`boolean`",{"id":154,"label":155,"isCorrect":8},"4726","`number`",{"id":157,"label":158,"isCorrect":8},"4727","`bigint`",{"id":160,"label":161,"isCorrect":149},"4728","`float`",{"id":163,"label":164,"isCorrect":8},"4729","`string`",{"id":166,"label":167,"isCorrect":8},"4730","`symbol`",{"id":169,"label":170,"isCorrect":8},"4731","`object`",{"id":172,"label":173,"isCorrect":149},"4732","`character`","Следует запомнить, что в JavaScript существует 7 примитивных типов плюс 1 непримитивный (`object`): всего 8. \nУдобная проверка — перечисление того, что возвращает `typeof` для значений, с отдельным запоминанием исключения `null`.","Правильные ответы:\n\n- `undefined`\n- `null`\n- `boolean`\n- `number`\n- `bigint`\n- `string`\n- `symbol`\n- `object`\n\nНеправильные ответы:\n\n- `array` — массивы не являются отдельным типом верхнего уровня, это частный случай `object`\n- `float` — отдельного типа для чисел с плавающей точкой нет, используется `number`\n- `character` — отдельного символьного типа нет, одиночный символ хранится в `string`","quizQuestion",{"title":7,"description":178,"ogTitle":179,"ogDescription":178,"ogImageUrl":180,"canonical":19,"ogLocale":181,"ogSiteName":182,"ogImageType":183,"ogImageWidth":184,"ogImageHeight":185,"ogType":186,"ogUrl":19},"Полный список типов JS, отличия примитивов от объектов, typeof, примеры и частые ошибки для начинающих.","Типы данных в JavaScript: примитивы и объекты","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":188,"siteUrl":189},"GOOD WEB JOB!","https://goodwebjob.ru",[191],{"label":192,"slug":193,"to":194},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":196,"navigationSublist":204},[197,200],{"path":194,"isActive":149,"name":198,"icon":199,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":201,"isActive":8,"name":202,"icon":203,"isNavbarMobileDisabled":149},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[205,214,241,253,259,399,423,432,438,501,522,528],{"title":206,"list":207,"isOpened":149},"Bash",[208,211],{"name":209,"path":210,"isActive":149},"Дан фрагмент 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":212,"path":213,"isActive":149},"Дан фрагмент 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":215,"list":216,"isOpened":149},"CSS",[217,220,223,226,229,232,235,238],{"name":218,"path":219,"isActive":149},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":221,"path":222,"isActive":149},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":224,"path":225,"isActive":149},"Есть шаблон вложенного 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":227,"path":228,"isActive":149},"Есть шаблон вложенного 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":230,"path":231,"isActive":149},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":233,"path":234,"isActive":149},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":236,"path":237,"isActive":149},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":239,"path":240,"isActive":149},"Есть 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":242,"list":243,"isOpened":149},"Git",[244,247,250],{"name":245,"path":246,"isActive":149},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/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":248,"path":249,"isActive":149},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":251,"path":252,"isActive":149},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":254,"list":255,"isOpened":149},"HTML",[256],{"name":257,"path":258,"isActive":149},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":260,"list":261,"isOpened":149},"JavaScript",[262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307,310,313,316,319,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396],{"name":263,"path":264,"isActive":149},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":266,"path":267,"isActive":149},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":269,"path":270,"isActive":149},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":272,"path":273,"isActive":149},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":275,"path":276,"isActive":149},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":278,"path":279,"isActive":149},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":281,"path":282,"isActive":149},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение 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":284,"path":285,"isActive":149},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":287,"path":288,"isActive":149},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":290,"path":291,"isActive":149},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":293,"path":294,"isActive":149},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":296,"path":297,"isActive":149},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":299,"path":300,"isActive":149},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":302,"path":303,"isActive":149},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":305,"path":306,"isActive":149},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":308,"path":309,"isActive":149},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":311,"path":312,"isActive":149},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":314,"path":315,"isActive":149},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":317,"path":318,"isActive":149},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":7,"path":320,"isActive":149},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":322,"path":323,"isActive":149},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":325,"path":326,"isActive":149},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":328,"path":329,"isActive":149},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":331,"path":332,"isActive":149},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":334,"path":335,"isActive":149},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":337,"path":338,"isActive":149},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":340,"path":341,"isActive":149},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":343,"path":344,"isActive":149},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":346,"path":347,"isActive":149},"Вернуть массив от 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":349,"path":350,"isActive":149},"Дана строка: '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":352,"path":353,"isActive":149},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":355,"path":356,"isActive":149},"Для каждого вложенного объекта нужно добавить свойство 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":358,"path":359,"isActive":149},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":361,"path":362,"isActive":149},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":364,"path":365,"isActive":149},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":367,"path":368,"isActive":149},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":370,"path":371,"isActive":149}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":373,"path":374,"isActive":149},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":376,"path":377,"isActive":149},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":379,"path":380,"isActive":149},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":382,"path":383,"isActive":149},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":385,"path":386,"isActive":149},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":388,"path":389,"isActive":149},"Реализовать функцию, принимающую аргументы \"*\", \"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":391,"path":392,"isActive":149},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":394,"path":395,"isActive":149},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":397,"path":398,"isActive":149},"Числа от 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":400,"list":401,"isOpened":149},"React",[402,405,408,411,414,417,420],{"name":403,"path":404,"isActive":149},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":406,"path":407,"isActive":149},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":409,"path":410,"isActive":149},"Если убрать в 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":412,"path":413,"isActive":149},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":415,"path":416,"isActive":149},"Есть код, в котором список и кнопка. Что в реальном 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":418,"path":419,"isActive":149},"Зачем нужен 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":421,"path":422,"isActive":149},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/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":424,"list":425,"isOpened":149},"Алгоритмы",[426,429],{"name":427,"path":428,"isActive":149},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":430,"path":431,"isActive":149},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":433,"list":434,"isOpened":149},"Дебаггинг",[435],{"name":436,"path":437,"isActive":149},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/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":439,"list":440,"isOpened":149},"Компьютерные сети",[441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,492,495,498],{"name":442,"path":443,"isActive":149},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":445,"path":446,"isActive":149},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":448,"path":449,"isActive":149},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":451,"path":452,"isActive":149},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":454,"path":455,"isActive":149},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":457,"path":458,"isActive":149},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":460,"path":461,"isActive":149},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":463,"path":464,"isActive":149},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":466,"path":467,"isActive":149},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":469,"path":470,"isActive":149},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":472,"path":473,"isActive":149},"Чем отличаются 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":475,"path":476,"isActive":149},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/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":478,"path":479,"isActive":149},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":481,"path":482,"isActive":149},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":484,"path":485,"isActive":149},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":487,"path":488,"isActive":149},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/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":490,"path":491,"isActive":149},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":493,"path":494,"isActive":149},"Все данные зашифрованы, используется 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":496,"path":497,"isActive":149},"Есть веб-приложение. Помимо 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":499,"path":500,"isActive":149},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":502,"list":503,"isOpened":149},"Отрисовка в браузере",[504,507,510,513,516,519],{"name":505,"path":506,"isActive":149},"Что происходит, когда 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":508,"path":509,"isActive":149},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":511,"path":512,"isActive":149},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":514,"path":515,"isActive":149},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":517,"path":518,"isActive":149},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":520,"path":521,"isActive":149},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":523,"list":524,"isOpened":149},"Ревью кода",[525],{"name":526,"path":527,"isActive":149},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":529,"list":530,"isOpened":149},"Теория вероятности",[531,534,537],{"name":532,"path":533,"isActive":149},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/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":535,"path":536,"isActive":149},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/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":538,"path":539,"isActive":149},"Как гарантированно найти лёгкую фальшивую монету среди 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":541},[542,545,547,549,551,554,557,559,561,563,565,567,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,646,648,651,653,655,657,659,661,663,665,667,669,671,673,675,677,679,681,683,685,687,689,691,693,695,697,699,701,703,705,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,752,754,756,758,760],{"name":543,"value":544},"Теоретические задания","theoretical-tasks",{"name":299,"value":546},"what-this-code-will-return-typeof-function",{"name":198,"value":548},"where-to-begin",{"name":266,"value":550},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":552,"value":553},"Backend","backend",{"name":555,"value":556},"Frontend","frontend",{"name":263,"value":558},"prototype-what-logical-values-will-be-received-in-console-log",{"name":379,"value":560},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":370,"value":562},"find-non-repeating-numbers-in-an-array",{"name":343,"value":564},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":349,"value":566},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":568,"value":569},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":355,"value":571},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":272,"value":573},"what-value-will-the-console-output-with-object-property",{"name":275,"value":575},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":346,"value":577},"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":376,"value":579},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":382,"value":581},"determines-whether-a-word-is-a-palindrome",{"name":361,"value":583},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":388,"value":585},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":352,"value":587},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":358,"value":589},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":364,"value":591},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":397,"value":593},"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":367,"value":595},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":373,"value":597},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":278,"value":599},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":281,"value":601},"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":293,"value":603},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":296,"value":605},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":394,"value":607},"unifying-values-in-an-array",{"name":385,"value":609},"flattening-the-array",{"name":284,"value":611},"what-will-the-book-get-upper-name-method-return",{"name":391,"value":613},"string-compression",{"name":290,"value":615},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":302,"value":617},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":442,"value":619},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":448,"value":621},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":451,"value":623},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":454,"value":625},"key-differences-between-tcp-and-udp",{"name":457,"value":627},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":460,"value":629},"what-is-http-and-what-does-it-consist-of",{"name":463,"value":631},"what-are-http-headers-and-why-do-we-need-them",{"name":466,"value":633},"what-are-http-parameters",{"name":469,"value":635},"where-is-the-html-code-located-in-the-http-response-structure",{"name":257,"value":637},"what-is-html",{"name":472,"value":639},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":475,"value":641},"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":478,"value":643},"what-is-a-cookie",{"name":481,"value":645},"who-initiates-the-cookie-recording-in-the-browser",{"name":484,"value":647},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":649,"value":650},"Лайвкодинг","livecoding",{"name":269,"value":652},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":490,"value":654},"is-everything-that-goes-through-https-secure",{"name":493,"value":656},"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":496,"value":658},"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":508,"value":660},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":505,"value":662},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":511,"value":664},"what-is-blocking-the-page-rendering-in-the-browser",{"name":514,"value":666},"what-is-dom-in-a-browser-what-is-cssom",{"name":517,"value":668},"what-are-nodes-in-the-dom",{"name":520,"value":670},"what-does-cssom-consist-of",{"name":218,"value":672},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":221,"value":674},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":224,"value":676},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":227,"value":678},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":230,"value":680},"there-is-an-html-code-will-font-weight-affect-span",{"name":233,"value":682},"what-are-the-differences-between-flexbox-and-grid",{"name":236,"value":684},"do-flexbox-and-grid-replace-each-other",{"name":239,"value":686},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":202,"value":688},"tasks",{"name":305,"value":690},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":308,"value":692},"what-is-this-in-javascript",{"name":311,"value":694},"what-is-an-event-loop-and-how-does-it-work",{"name":314,"value":696},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":317,"value":698},"what-does-the-typeof-operator-show-in-javascript",{"name":7,"value":700},"what-types-of-data-exist-in-javascript",{"name":322,"value":702},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":325,"value":704},"what-will-typeof-return-for-an-array",{"name":328,"value":706},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":331,"value":708},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":334,"value":710},"what-does-typeof-return-for-new-set-in-javascript",{"name":403,"value":712},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":409,"value":714},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":412,"value":716},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":415,"value":718},"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":418,"value":720},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":436,"value":722},"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":245,"value":724},"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":248,"value":726},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":251,"value":728},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":526,"value":730},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":209,"value":732},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":212,"value":734},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":427,"value":736},"what-is-algorithmic-complexity",{"name":430,"value":738},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":337,"value":740},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":499,"value":742},"how-can-a-user-be-authorized-on-a-website",{"name":340,"value":744},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":532,"value":746},"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":535,"value":748},"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":538,"value":750},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":192,"value":193},{"name":487,"value":753},"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":445,"value":755},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":287,"value":757},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":406,"value":759},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":421,"value":761},"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":763,"copyright":766,"reportError":767,"socialNetwork":769},{"link":764,"title":765},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":768,"link":764},"Сообщить об ошибке",{"label":770,"socialNetworkList":771},"Мы в соцсетях:",[772,775,778],{"icon":19,"link":773,"title":774},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":776,"link":764,"title":777},"ic:baseline-telegram","Telegram",{"icon":779,"link":780,"title":781},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":783,"body":784},{},{"type":785,"children":786},"root",[787],{"type":788,"tag":789,"props":790,"children":791},"element","p",{},[792],{"type":793,"value":7},"text",{"data":795,"body":796},{},{"type":785,"children":797},[798],{"type":788,"tag":789,"props":799,"children":800},{},[801],{"type":788,"tag":802,"props":803,"children":805},"code",{"className":804},[],[806],{"type":793,"value":58},{"data":808,"body":809},{},{"type":785,"children":810},[811],{"type":788,"tag":789,"props":812,"children":813},{},[814],{"type":788,"tag":802,"props":815,"children":817},{"className":816},[],[818],{"type":793,"value":70},{"data":820,"body":821},{},{"type":785,"children":822},[823],{"type":788,"tag":789,"props":824,"children":825},{},[826],{"type":788,"tag":802,"props":827,"children":829},{"className":828},[],[830],{"type":793,"value":76},{"data":832,"body":833},{},{"type":785,"children":834},[835],{"type":788,"tag":789,"props":836,"children":837},{},[838],{"type":788,"tag":802,"props":839,"children":841},{"className":840},[],[842],{"type":793,"value":843},"float",{"data":845,"body":846},{},{"type":785,"children":847},[848],{"type":788,"tag":789,"props":849,"children":850},{},[851],{"type":788,"tag":802,"props":852,"children":854},{"className":853},[],[855],{"type":793,"value":88},{"data":857,"body":858},{},{"type":785,"children":859},[860],{"type":788,"tag":789,"props":861,"children":862},{},[863],{"type":788,"tag":802,"props":864,"children":866},{"className":865},[],[867],{"type":793,"value":97},{"data":869,"body":870},{},{"type":785,"children":871},[872],{"type":788,"tag":789,"props":873,"children":874},{},[875],{"type":788,"tag":802,"props":876,"children":878},{"className":877},[],[879],{"type":793,"value":880},"character",{"data":882,"body":883},{},{"type":785,"children":884},[885],{"type":788,"tag":789,"props":886,"children":887},{},[888,890,895,897,903,905,910],{"type":793,"value":889},"Следует запомнить, что в JavaScript существует 7 примитивных типов плюс 1 непримитивный (",{"type":788,"tag":802,"props":891,"children":893},{"className":892},[],[894],{"type":793,"value":103},{"type":793,"value":896},"): всего 8.\nУдобная проверка — перечисление того, что возвращает ",{"type":788,"tag":802,"props":898,"children":900},{"className":899},[],[901],{"type":793,"value":902},"typeof",{"type":793,"value":904}," для значений, с отдельным запоминанием исключения ",{"type":788,"tag":802,"props":906,"children":908},{"className":907},[],[909],{"type":793,"value":52},{"type":793,"value":911},".",{"data":913,"body":914},{},{"type":785,"children":915},[916,921,990,995],{"type":788,"tag":789,"props":917,"children":918},{},[919],{"type":793,"value":920},"Правильные ответы:",{"type":788,"tag":922,"props":923,"children":924},"ul",{},[925,934,942,950,958,966,974,982],{"type":788,"tag":926,"props":927,"children":928},"li",{},[929],{"type":788,"tag":802,"props":930,"children":932},{"className":931},[],[933],{"type":793,"value":40},{"type":788,"tag":926,"props":935,"children":936},{},[937],{"type":788,"tag":802,"props":938,"children":940},{"className":939},[],[941],{"type":793,"value":52},{"type":788,"tag":926,"props":943,"children":944},{},[945],{"type":788,"tag":802,"props":946,"children":948},{"className":947},[],[949],{"type":793,"value":58},{"type":788,"tag":926,"props":951,"children":952},{},[953],{"type":788,"tag":802,"props":954,"children":956},{"className":955},[],[957],{"type":793,"value":70},{"type":788,"tag":926,"props":959,"children":960},{},[961],{"type":788,"tag":802,"props":962,"children":964},{"className":963},[],[965],{"type":793,"value":76},{"type":788,"tag":926,"props":967,"children":968},{},[969],{"type":788,"tag":802,"props":970,"children":972},{"className":971},[],[973],{"type":793,"value":88},{"type":788,"tag":926,"props":975,"children":976},{},[977],{"type":788,"tag":802,"props":978,"children":980},{"className":979},[],[981],{"type":793,"value":97},{"type":788,"tag":926,"props":983,"children":984},{},[985],{"type":788,"tag":802,"props":986,"children":988},{"className":987},[],[989],{"type":793,"value":103},{"type":788,"tag":789,"props":991,"children":992},{},[993],{"type":793,"value":994},"Неправильные ответы:",{"type":788,"tag":922,"props":996,"children":997},{},[998,1014,1029],{"type":788,"tag":926,"props":999,"children":1000},{},[1001,1007,1009],{"type":788,"tag":802,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":793,"value":1006},"array",{"type":793,"value":1008}," — массивы не являются отдельным типом верхнего уровня, это частный случай ",{"type":788,"tag":802,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":793,"value":103},{"type":788,"tag":926,"props":1015,"children":1016},{},[1017,1022,1024],{"type":788,"tag":802,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":793,"value":843},{"type":793,"value":1023}," — отдельного типа для чисел с плавающей точкой нет, используется ",{"type":788,"tag":802,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":793,"value":70},{"type":788,"tag":926,"props":1030,"children":1031},{},[1032,1037,1039],{"type":788,"tag":802,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":793,"value":880},{"type":793,"value":1038}," — отдельного символьного типа нет, одиночный символ хранится в ",{"type":788,"tag":802,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":793,"value":88},{"data":1045,"body":1046},{},{"type":785,"children":1047},[1048],{"type":788,"tag":789,"props":1049,"children":1050},{},[1051,1053,1058],{"type":793,"value":1052},"В спецификации ECMAScript значения делятся на примитивные типы и тип ",{"type":788,"tag":802,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":793,"value":103},{"type":793,"value":1059},". Примитивы представляют собой неделимые значения (число, строка и т.д.), а объекты — контейнеры со свойствами и поведением.",{"data":1061,"body":1062},{},{"type":785,"children":1063},[1064],{"type":788,"tag":789,"props":1065,"children":1066},{},[1067,1069,1074,1076,1081,1082,1087,1088,1093,1094,1099,1100,1105,1106,1111,1112,1117],{"type":793,"value":1068},"Термин “тип данных” в JavaScript обычно означает именно эти 8 категорий значений: ",{"type":788,"tag":802,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":793,"value":40},{"type":793,"value":1075},", ",{"type":788,"tag":802,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":793,"value":52},{"type":793,"value":1075},{"type":788,"tag":802,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":793,"value":58},{"type":793,"value":1075},{"type":788,"tag":802,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":793,"value":70},{"type":793,"value":1075},{"type":788,"tag":802,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":793,"value":76},{"type":793,"value":1075},{"type":788,"tag":802,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":793,"value":88},{"type":793,"value":1075},{"type":788,"tag":802,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":793,"value":97},{"type":793,"value":1075},{"type":788,"tag":802,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":793,"value":103},{"type":793,"value":911},{"data":1119,"body":1120},{},{"type":785,"children":1121},[1122],{"type":788,"tag":1123,"props":1124,"children":1128},"pre",{"className":1125,"code":1127,"language":793},[1126],"language-text","Значения JavaScript\n├─ Примитивы (7)\n│  ├─ undefined\n│  ├─ null\n│  ├─ boolean\n│  ├─ number\n│  ├─ bigint\n│  ├─ string\n│  └─ symbol\n└─ Object (1, непримитивный)\n   ├─ plain object {}\n   ├─ array []\n   ├─ function () {}\n   ├─ date new Date()\n   ├─ map/set new Map(), new Set()\n   └─ и другие встроенные/пользовательские объекты\n",[1129],{"type":788,"tag":802,"props":1130,"children":1132},{"__ignoreMap":1131},"",[1133],{"type":793,"value":1127},{"data":1135,"body":1136},{},{"type":785,"children":1137},[1138],{"type":788,"tag":1139,"props":1140,"children":1141},"table",{},[1142,1176],{"type":788,"tag":1143,"props":1144,"children":1145},"thead",{},[1146],{"type":788,"tag":1147,"props":1148,"children":1149},"tr",{},[1150,1156,1166,1171],{"type":788,"tag":1151,"props":1152,"children":1153},"th",{},[1154],{"type":793,"value":1155},"Тип",{"type":788,"tag":1151,"props":1157,"children":1158},{},[1159,1161],{"type":793,"value":1160},"Результат ",{"type":788,"tag":802,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":793,"value":902},{"type":788,"tag":1151,"props":1167,"children":1168},{},[1169],{"type":793,"value":1170},"Пример значения",{"type":788,"tag":1151,"props":1172,"children":1173},{},[1174],{"type":793,"value":1175},"Важная особенность",{"type":788,"tag":1177,"props":1178,"children":1179},"tbody",{},[1180,1213,1258,1304,1370,1409,1450,1483],{"type":788,"tag":1147,"props":1181,"children":1182},{},[1183,1192,1200,1208],{"type":788,"tag":1184,"props":1185,"children":1186},"td",{},[1187],{"type":788,"tag":802,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":793,"value":40},{"type":788,"tag":1184,"props":1193,"children":1194},{},[1195],{"type":788,"tag":802,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":793,"value":40},{"type":788,"tag":1184,"props":1201,"children":1202},{},[1203],{"type":788,"tag":802,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":793,"value":40},{"type":788,"tag":1184,"props":1209,"children":1210},{},[1211],{"type":793,"value":1212},"“Значение отсутствует” (часто у неинициализированных переменных)",{"type":788,"tag":1147,"props":1214,"children":1215},{},[1216,1224,1232,1240],{"type":788,"tag":1184,"props":1217,"children":1218},{},[1219],{"type":788,"tag":802,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":793,"value":52},{"type":788,"tag":1184,"props":1225,"children":1226},{},[1227],{"type":788,"tag":802,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":793,"value":103},{"type":788,"tag":1184,"props":1233,"children":1234},{},[1235],{"type":788,"tag":802,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":793,"value":52},{"type":788,"tag":1184,"props":1241,"children":1242},{},[1243,1245,1251,1253],{"type":793,"value":1244},"Историческая особенность: ",{"type":788,"tag":802,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":793,"value":1250},"typeof null",{"type":793,"value":1252}," возвращает ",{"type":788,"tag":802,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":793,"value":103},{"type":788,"tag":1147,"props":1259,"children":1260},{},[1261,1269,1277,1286],{"type":788,"tag":1184,"props":1262,"children":1263},{},[1264],{"type":788,"tag":802,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":793,"value":58},{"type":788,"tag":1184,"props":1270,"children":1271},{},[1272],{"type":788,"tag":802,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":793,"value":58},{"type":788,"tag":1184,"props":1278,"children":1279},{},[1280],{"type":788,"tag":802,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":793,"value":1285},"true",{"type":788,"tag":1184,"props":1287,"children":1288},{},[1289,1291,1296,1298],{"type":793,"value":1290},"Только ",{"type":788,"tag":802,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":793,"value":1285},{"type":793,"value":1297}," и ",{"type":788,"tag":802,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":793,"value":1303},"false",{"type":788,"tag":1147,"props":1305,"children":1306},{},[1307,1315,1323,1346],{"type":788,"tag":1184,"props":1308,"children":1309},{},[1310],{"type":788,"tag":802,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":793,"value":70},{"type":788,"tag":1184,"props":1316,"children":1317},{},[1318],{"type":788,"tag":802,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":793,"value":70},{"type":788,"tag":1184,"props":1324,"children":1325},{},[1326,1332,1333,1339,1340],{"type":788,"tag":802,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":793,"value":1331},"42",{"type":793,"value":1075},{"type":788,"tag":802,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":793,"value":1338},"3.14",{"type":793,"value":1075},{"type":788,"tag":802,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":793,"value":1345},"NaN",{"type":788,"tag":1184,"props":1347,"children":1348},{},[1349,1351,1356,1357,1363,1364],{"type":793,"value":1350},"Все обычные числа, включая ",{"type":788,"tag":802,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":793,"value":1345},{"type":793,"value":1075},{"type":788,"tag":802,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":793,"value":1362},"Infinity",{"type":793,"value":1075},{"type":788,"tag":802,"props":1365,"children":1367},{"className":1366},[],[1368],{"type":793,"value":1369},"-0",{"type":788,"tag":1147,"props":1371,"children":1372},{},[1373,1381,1389,1398],{"type":788,"tag":1184,"props":1374,"children":1375},{},[1376],{"type":788,"tag":802,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":793,"value":76},{"type":788,"tag":1184,"props":1382,"children":1383},{},[1384],{"type":788,"tag":802,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":793,"value":76},{"type":788,"tag":1184,"props":1390,"children":1391},{},[1392],{"type":788,"tag":802,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":793,"value":1397},"9007199254740993n",{"type":788,"tag":1184,"props":1399,"children":1400},{},[1401,1403],{"type":793,"value":1402},"Целые числа произвольной длины, литерал с ",{"type":788,"tag":802,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":793,"value":1408},"n",{"type":788,"tag":1147,"props":1410,"children":1411},{},[1412,1420,1428,1437],{"type":788,"tag":1184,"props":1413,"children":1414},{},[1415],{"type":788,"tag":802,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":793,"value":88},{"type":788,"tag":1184,"props":1421,"children":1422},{},[1423],{"type":788,"tag":802,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":793,"value":88},{"type":788,"tag":1184,"props":1429,"children":1430},{},[1431],{"type":788,"tag":802,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":793,"value":1436},"\"привет\"",{"type":788,"tag":1184,"props":1438,"children":1439},{},[1440,1442,1448],{"type":793,"value":1441},"Строки в Unicode, отдельного ",{"type":788,"tag":802,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":793,"value":1447},"char",{"type":793,"value":1449}," нет",{"type":788,"tag":1147,"props":1451,"children":1452},{},[1453,1461,1469,1478],{"type":788,"tag":1184,"props":1454,"children":1455},{},[1456],{"type":788,"tag":802,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":793,"value":97},{"type":788,"tag":1184,"props":1462,"children":1463},{},[1464],{"type":788,"tag":802,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":793,"value":97},{"type":788,"tag":1184,"props":1470,"children":1471},{},[1472],{"type":788,"tag":802,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":793,"value":1477},"Symbol(\"id\")",{"type":788,"tag":1184,"props":1479,"children":1480},{},[1481],{"type":793,"value":1482},"Уникальные идентификаторы, часто для “скрытых” ключей",{"type":788,"tag":1147,"props":1484,"children":1485},{},[1486,1494,1512,1535],{"type":788,"tag":1184,"props":1487,"children":1488},{},[1489],{"type":788,"tag":802,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":793,"value":103},{"type":788,"tag":1184,"props":1495,"children":1496},{},[1497,1502,1504,1510],{"type":788,"tag":802,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":793,"value":103},{"type":793,"value":1503}," (или ",{"type":788,"tag":802,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":793,"value":1509},"function",{"type":793,"value":1511},")",{"type":788,"tag":1184,"props":1513,"children":1514},{},[1515,1521,1522,1528,1529],{"type":788,"tag":802,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":793,"value":1520},"{}",{"type":793,"value":1075},{"type":788,"tag":802,"props":1523,"children":1525},{"className":1524},[],[1526],{"type":793,"value":1527},"[]",{"type":793,"value":1075},{"type":788,"tag":802,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":793,"value":1534},"() => {}",{"type":788,"tag":1184,"props":1536,"children":1537},{},[1538],{"type":793,"value":1539},"Объекты и функции (функции — вызываемые объекты)",{"data":1541,"body":1542},{},{"type":785,"children":1543},[1544,1561,1580],{"type":788,"tag":789,"props":1545,"children":1546},{},[1547,1552,1554,1560],{"type":788,"tag":802,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":793,"value":40},{"type":793,"value":1553}," означает, что значение не задано. Часто появляется у объявленной, но не инициализированной переменной, у отсутствующего свойства, а также как результат функции без ",{"type":788,"tag":802,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":793,"value":1559},"return",{"type":793,"value":911},{"type":788,"tag":789,"props":1562,"children":1563},{},[1564,1566,1572,1573,1579],{"type":793,"value":1565},"Примеры: ",{"type":788,"tag":802,"props":1567,"children":1569},{"className":1568},[],[1570],{"type":793,"value":1571},"let a;",{"type":793,"value":1297},{"type":788,"tag":802,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":793,"value":1578},"typeof a",{"type":793,"value":911},{"type":788,"tag":1123,"props":1581,"children":1584},{"className":1582,"code":1583,"language":793},[1126],"let a;\nconsole.log(a);           // undefined\nconsole.log(typeof a);    // \"undefined\"\n\nconst obj = {};\nconsole.log(obj.missing); // undefined\n\nfunction f() {}\nconsole.log(f());         // undefined\n",[1585],{"type":788,"tag":802,"props":1586,"children":1587},{"__ignoreMap":1131},[1588],{"type":793,"value":1583},{"data":1590,"body":1591},{},{"type":785,"children":1592},[1593],{"type":788,"tag":789,"props":1594,"children":1595},{},[1596,1601,1603,1608],{"type":788,"tag":802,"props":1597,"children":1599},{"className":1598},[],[1600],{"type":793,"value":40},{"type":793,"value":1602}," и “не существует” — не одно и то же: переменная может не существовать (ReferenceError), а может существовать и быть равной ",{"type":788,"tag":802,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":793,"value":40},{"type":793,"value":911},{"data":1610,"body":1611},{},{"type":785,"children":1612},[1613],{"type":788,"tag":1123,"props":1614,"children":1617},{"className":1615,"code":1616,"language":793},[1126],"// Пример различия (в модуле/строгом режиме будет ReferenceError)\nconsole.log(notDeclared); // ReferenceError: notDeclared is not defined\n\nlet declared;\nconsole.log(declared);    // undefined\n",[1618],{"type":788,"tag":802,"props":1619,"children":1620},{"__ignoreMap":1131},[1621],{"type":793,"value":1616},{"data":1623,"body":1624},{},{"type":785,"children":1625},[1626,1636,1654,1663,1684],{"type":788,"tag":789,"props":1627,"children":1628},{},[1629,1634],{"type":788,"tag":802,"props":1630,"children":1632},{"className":1631},[],[1633],{"type":793,"value":52},{"type":793,"value":1635}," обычно означает “пустое значение по намерению”: объект отсутствует, ссылка очищена и т.п.",{"type":788,"tag":789,"props":1637,"children":1638},{},[1639,1640,1646,1647,1653],{"type":793,"value":1565},{"type":788,"tag":802,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":793,"value":1645},"const x = null;",{"type":793,"value":1297},{"type":788,"tag":802,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":793,"value":1652},"x === null",{"type":793,"value":911},{"type":788,"tag":1123,"props":1655,"children":1658},{"className":1656,"code":1657,"language":793},[1126],"const x = null;\nconsole.log(x);             // null\nconsole.log(x === null);    // true\nconsole.log(typeof x);      // \"object\" (историческая особенность)\n",[1659],{"type":788,"tag":802,"props":1660,"children":1661},{"__ignoreMap":1131},[1662],{"type":793,"value":1657},{"type":788,"tag":789,"props":1664,"children":1665},{},[1666,1668,1674,1676,1682],{"type":793,"value":1667},"Практическая проверка на “null или undefined” часто делается через ",{"type":788,"tag":802,"props":1669,"children":1671},{"className":1670},[],[1672],{"type":793,"value":1673},"x == null",{"type":793,"value":1675},", потому что нестрогое равенство в этом месте намеренно устроено так, что ",{"type":788,"tag":802,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":793,"value":1681},"null == undefined",{"type":793,"value":1683}," истинно.",{"type":788,"tag":1123,"props":1685,"children":1688},{"className":1686,"code":1687,"language":793},[1126],"const a = null;\nconst b = undefined;\n\nconsole.log(a == null);      // true\nconsole.log(b == null);      // true\nconsole.log(a === null);     // true\nconsole.log(b === null);     // false\n",[1689],{"type":788,"tag":802,"props":1690,"children":1691},{"__ignoreMap":1131},[1692],{"type":793,"value":1687},{"data":1694,"body":1695},{},{"type":785,"children":1696},[1697,1720,1732],{"type":788,"tag":789,"props":1698,"children":1699},{},[1700,1705,1707,1712,1713,1718],{"type":788,"tag":802,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":793,"value":58},{"type":793,"value":1706}," содержит только два значения: ",{"type":788,"tag":802,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":793,"value":1285},{"type":793,"value":1297},{"type":788,"tag":802,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":793,"value":1303},{"type":793,"value":1719},". В условиях выполняется приведение к булеву значению (truthy/falsy).",{"type":788,"tag":789,"props":1721,"children":1722},{},[1723,1725,1731],{"type":793,"value":1724},"Пример: ",{"type":788,"tag":802,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":793,"value":1730},"Boolean(\"x\")",{"type":793,"value":911},{"type":788,"tag":1123,"props":1733,"children":1736},{"className":1734,"code":1735,"language":793},[1126],"console.log(typeof true);         // \"boolean\"\nconsole.log(Boolean(0));          // false\nconsole.log(Boolean(\"\"));         // false\nconsole.log(Boolean(\"text\"));     // true\nconsole.log(Boolean([]));         // true\nconsole.log(Boolean({}));         // true\n",[1737],{"type":788,"tag":802,"props":1738,"children":1739},{"__ignoreMap":1131},[1740],{"type":793,"value":1735},{"data":1742,"body":1743},{},{"type":785,"children":1744},[1745],{"type":788,"tag":789,"props":1746,"children":1747},{},[1748,1750,1756],{"type":793,"value":1749},"Объект-обертка ",{"type":788,"tag":802,"props":1751,"children":1753},{"className":1752},[],[1754],{"type":793,"value":1755},"new Boolean(false)",{"type":793,"value":1757}," является объектом и ведет себя как truthy в условиях, что часто вызывает ошибки.",{"data":1759,"body":1760},{},{"type":785,"children":1761},[1762],{"type":788,"tag":1123,"props":1763,"children":1766},{"className":1764,"code":1765,"language":793},[1126],"const b = new Boolean(false);\n\nconsole.log(typeof b); // \"object\"\nif (b) {\n  console.log(\"Сработает, потому что это объект\"); \n}\n",[1767],{"type":788,"tag":802,"props":1768,"children":1769},{"__ignoreMap":1131},[1770],{"type":793,"value":1765},{"data":1772,"body":1773},{},{"type":785,"children":1774},[1775,1805,1823,1832],{"type":788,"tag":789,"props":1776,"children":1777},{},[1778,1783,1785,1790,1791,1796,1797,1803],{"type":788,"tag":802,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":793,"value":70},{"type":793,"value":1784}," — единственный “обычный” числовой тип: целые и дробные значения, а также специальные значения ",{"type":788,"tag":802,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":793,"value":1345},{"type":793,"value":1075},{"type":788,"tag":802,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":793,"value":1362},{"type":793,"value":1075},{"type":788,"tag":802,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":793,"value":1802},"-Infinity",{"type":793,"value":1804},". В основе лежит формат IEEE 754 двойной точности, что объясняет ошибки округления.",{"type":788,"tag":789,"props":1806,"children":1807},{},[1808,1809,1815,1816,1822],{"type":793,"value":1565},{"type":788,"tag":802,"props":1810,"children":1812},{"className":1811},[],[1813],{"type":793,"value":1814},"Number.isNaN(NaN)",{"type":793,"value":1297},{"type":788,"tag":802,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":793,"value":1821},"0.1 + 0.2",{"type":793,"value":911},{"type":788,"tag":1123,"props":1824,"children":1827},{"className":1825,"code":1826,"language":793},[1126],"console.log(typeof 123);        // \"number\"\nconsole.log(typeof 3.14);       // \"number\"\n\nconsole.log(0.1 + 0.2);         // 0.30000000000000004\nconsole.log(Number.isNaN(NaN)); // true\nconsole.log(NaN === NaN);       // false\n\nconsole.log(1 / 0);             // Infinity\nconsole.log(-1 / 0);            // -Infinity\nconsole.log(Object.is(-0, 0));  // false (в JS существуют +0 и -0)\n",[1828],{"type":788,"tag":802,"props":1829,"children":1830},{"__ignoreMap":1131},[1831],{"type":793,"value":1826},{"type":788,"tag":789,"props":1833,"children":1834},{},[1835,1837,1842],{"type":793,"value":1836},"Для денежных расчетов часто выбирается подход “хранить в целых минимальных единицах” (например, копейки) или использовать ",{"type":788,"tag":802,"props":1838,"children":1840},{"className":1839},[],[1841],{"type":793,"value":76},{"type":793,"value":1843}," там, где нужна целочисленная точность и нет дробной части.",{"data":1845,"body":1846},{},{"type":785,"children":1847},[1848,1879,1896],{"type":788,"tag":789,"props":1849,"children":1850},{},[1851,1856,1858,1863,1865,1870,1872,1877],{"type":788,"tag":802,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":793,"value":76},{"type":793,"value":1857}," предназначен для целых чисел произвольной длины. Литералы пишутся с суффиксом ",{"type":788,"tag":802,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":793,"value":1408},{"type":793,"value":1864},". ",{"type":788,"tag":802,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":793,"value":76},{"type":793,"value":1871}," не смешивается с ",{"type":788,"tag":802,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":793,"value":70},{"type":793,"value":1878}," в арифметике без явного преобразования.",{"type":788,"tag":789,"props":1880,"children":1881},{},[1882,1883,1888,1889,1895],{"type":793,"value":1565},{"type":788,"tag":802,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":793,"value":1397},{"type":793,"value":1297},{"type":788,"tag":802,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":793,"value":1894},"typeof 1n",{"type":793,"value":911},{"type":788,"tag":1123,"props":1897,"children":1900},{"className":1898,"code":1899,"language":793},[1126],"const safeLimit = Number.MAX_SAFE_INTEGER; // 9007199254740991\nconsole.log(safeLimit + 1);                // 9007199254740992\nconsole.log(safeLimit + 2);                // 9007199254740992 (теряется точность)\n\nconst big = 9007199254740993n;\nconsole.log(big + 2n);                     // 9007199254740995n\nconsole.log(typeof big);                   // \"bigint\"\n",[1901],{"type":788,"tag":802,"props":1902,"children":1903},{"__ignoreMap":1131},[1904],{"type":793,"value":1899},{"data":1906,"body":1907},{},{"type":785,"children":1908},[1909],{"type":788,"tag":789,"props":1910,"children":1911},{},[1912,1914,1919,1920,1925],{"type":793,"value":1913},"Операции между ",{"type":788,"tag":802,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":793,"value":70},{"type":793,"value":1297},{"type":788,"tag":802,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":793,"value":76},{"type":793,"value":1926}," выбрасывают ошибку TypeError.",{"data":1928,"body":1929},{},{"type":785,"children":1930},[1931],{"type":788,"tag":1123,"props":1932,"children":1935},{"className":1933,"code":1934,"language":793},[1126],"const a = 10n;\nconst b = 2;\n\n// console.log(a + b); // TypeError: Cannot mix BigInt and other types\n\nconsole.log(a + BigInt(b)); // 12n\nconsole.log(Number(a) + b); // 12 (возможна потеря точности при больших значениях)\n",[1936],{"type":788,"tag":802,"props":1937,"children":1938},{"__ignoreMap":1131},[1939],{"type":793,"value":1934},{"data":1941,"body":1942},{},{"type":785,"children":1943},[1944,1954,1972],{"type":788,"tag":789,"props":1945,"children":1946},{},[1947,1952],{"type":788,"tag":802,"props":1948,"children":1950},{"className":1949},[],[1951],{"type":793,"value":88},{"type":793,"value":1953}," хранит текст. Отдельного типа “символ” нет: один символ — это строка длины 1. Строки являются неизменяемыми (immutable): изменение символа “внутри” строки невозможно, создается новая строка.",{"type":788,"tag":789,"props":1955,"children":1956},{},[1957,1958,1964,1965,1971],{"type":793,"value":1565},{"type":788,"tag":802,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":793,"value":1963},"\"a\".length",{"type":793,"value":1297},{"type":788,"tag":802,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":793,"value":1970},"\"a\"[0]",{"type":793,"value":911},{"type":788,"tag":1123,"props":1973,"children":1976},{"className":1974,"code":1975,"language":793},[1126],"const s = \"hello\";\nconsole.log(typeof s);     // \"string\"\nconsole.log(s.length);     // 5\nconsole.log(s[0]);         // \"h\"\n\nconst t = \"h\" + \"i\";\nconsole.log(t);            // \"hi\"\n",[1977],{"type":788,"tag":802,"props":1978,"children":1979},{"__ignoreMap":1131},[1980],{"type":793,"value":1975},{"data":1982,"body":1983},{},{"type":785,"children":1984},[1985],{"type":788,"tag":789,"props":1986,"children":1987},{},[1988,1990,1996],{"type":793,"value":1989},"Работа с “символами” Unicode может быть нетривиальной: некоторые визуальные символы занимают два 16-битных элемента (суррогатные пары), поэтому ",{"type":788,"tag":802,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":793,"value":1995},"length",{"type":793,"value":1997}," не всегда равен числу видимых символов.",{"data":1999,"body":2000},{},{"type":785,"children":2001},[2002,2012,2029,2038,2051],{"type":788,"tag":789,"props":2003,"children":2004},{},[2005,2010],{"type":788,"tag":802,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":793,"value":97},{"type":793,"value":2011}," — уникальный примитив, чаще всего применяемый как ключ свойства, чтобы избежать конфликтов имен. Символы уникальны даже при одинаковом описании.",{"type":788,"tag":789,"props":2013,"children":2014},{},[2015,2016,2021,2022,2028],{"type":793,"value":1565},{"type":788,"tag":802,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":793,"value":1477},{"type":793,"value":1297},{"type":788,"tag":802,"props":2023,"children":2025},{"className":2024},[],[2026],{"type":793,"value":2027},"sym1 === sym2",{"type":793,"value":911},{"type":788,"tag":1123,"props":2030,"children":2033},{"className":2031,"code":2032,"language":793},[1126],"const sym1 = Symbol(\"id\");\nconst sym2 = Symbol(\"id\");\n\nconsole.log(typeof sym1);       // \"symbol\"\nconsole.log(sym1 === sym2);     // false\n\nconst user = {\n  name: \"Ann\",\n  [sym1]: 123\n};\n\nconsole.log(user.name);         // \"Ann\"\nconsole.log(user[sym1]);        // 123\nconsole.log(Object.keys(user)); // [\"name\"] (символьный ключ не перечисляется через keys)\n",[2034],{"type":788,"tag":802,"props":2035,"children":2036},{"__ignoreMap":1131},[2037],{"type":793,"value":2032},{"type":788,"tag":789,"props":2039,"children":2040},{},[2041,2043,2049],{"type":793,"value":2042},"Существует глобальный реестр символов через ",{"type":788,"tag":802,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":793,"value":2048},"Symbol.for(\"key\")",{"type":793,"value":2050},", в котором одинаковый ключ возвращает один и тот же символ.",{"type":788,"tag":1123,"props":2052,"children":2055},{"className":2053,"code":2054,"language":793},[1126],"const a = Symbol.for(\"shared\");\nconst b = Symbol.for(\"shared\");\nconsole.log(a === b); // true\n",[2056],{"type":788,"tag":802,"props":2057,"children":2058},{"__ignoreMap":1131},[2059],{"type":793,"value":2054},{"data":2061,"body":2062},{},{"type":785,"children":2063},[2064,2074,2092,2101,2106],{"type":788,"tag":789,"props":2065,"children":2066},{},[2067,2072],{"type":788,"tag":802,"props":2068,"children":2070},{"className":2069},[],[2071],{"type":793,"value":103},{"type":793,"value":2073}," — непримитивный тип: значения имеют идентичность (ссылку), свойства и прототип. Сюда относятся обычные объекты, массивы, функции, даты, коллекции и пользовательские экземпляры классов.",{"type":788,"tag":789,"props":2075,"children":2076},{},[2077,2078,2084,2085,2091],{"type":793,"value":1565},{"type":788,"tag":802,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":793,"value":2083},"typeof {}",{"type":793,"value":1297},{"type":788,"tag":802,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":793,"value":2090},"Array.isArray([])",{"type":793,"value":911},{"type":788,"tag":1123,"props":2093,"children":2096},{"className":2094,"code":2095,"language":793},[1126],"const obj = { a: 1 };\nconst arr = [1, 2, 3];\nfunction fn() {}\n\nconsole.log(typeof obj); // \"object\"\nconsole.log(typeof arr); // \"object\"\nconsole.log(typeof fn);  // \"function\"\n\nconsole.log(Array.isArray(arr)); // true\nconsole.log(arr instanceof Array); // true\n",[2097],{"type":788,"tag":802,"props":2098,"children":2099},{"__ignoreMap":1131},[2100],{"type":793,"value":2095},{"type":788,"tag":789,"props":2102,"children":2103},{},[2104],{"type":793,"value":2105},"Ключевая особенность объектов — сравнение по ссылке, а не по содержимому.",{"type":788,"tag":1123,"props":2107,"children":2110},{"className":2108,"code":2109,"language":793},[1126],"const a = { x: 1 };\nconst b = { x: 1 };\nconst c = a;\n\nconsole.log(a === b); // false (разные объекты)\nconsole.log(a === c); // true  (одна и та же ссылка)\n",[2111],{"type":788,"tag":802,"props":2112,"children":2113},{"__ignoreMap":1131},[2114],{"type":793,"value":2109},{"data":2116,"body":2117},{},{"type":785,"children":2118},[2119,2131,2140,2145,2181],{"type":788,"tag":789,"props":2120,"children":2121},{},[2122,2124,2129],{"type":793,"value":2123},"Оператор ",{"type":788,"tag":802,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":793,"value":902},{"type":793,"value":2130}," полезен, но имеет нюансы. Для надежных проверок обычно комбинируются разные техники.",{"type":788,"tag":1123,"props":2132,"children":2135},{"className":2133,"code":2134,"language":793},[1126],"// typeof для примитивов\nconsole.log(typeof undefined); // \"undefined\"\nconsole.log(typeof null);      // \"object\" (нюанс)\nconsole.log(typeof true);      // \"boolean\"\nconsole.log(typeof 1);         // \"number\"\nconsole.log(typeof 1n);        // \"bigint\"\nconsole.log(typeof \"x\");       // \"string\"\nconsole.log(typeof Symbol());  // \"symbol\"\n\n// typeof для объектов\nconsole.log(typeof {});        // \"object\"\nconsole.log(typeof []);        // \"object\"\nconsole.log(typeof (() => {})); // \"function\"\n",[2136],{"type":788,"tag":802,"props":2137,"children":2138},{"__ignoreMap":1131},[2139],{"type":793,"value":2134},{"type":788,"tag":789,"props":2141,"children":2142},{},[2143],{"type":793,"value":2144},"Для различения “обычный объект vs массив vs дата” часто применяются:",{"type":788,"tag":922,"props":2146,"children":2147},{},[2148,2159,2170],{"type":788,"tag":926,"props":2149,"children":2150},{},[2151,2157],{"type":788,"tag":802,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":793,"value":2156},"Array.isArray(value)",{"type":793,"value":2158}," для массивов",{"type":788,"tag":926,"props":2160,"children":2161},{},[2162,2168],{"type":788,"tag":802,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":793,"value":2167},"value instanceof Date",{"type":793,"value":2169}," для дат (в рамках одного глобального контекста)",{"type":788,"tag":926,"props":2171,"children":2172},{},[2173,2179],{"type":788,"tag":802,"props":2174,"children":2176},{"className":2175},[],[2177],{"type":793,"value":2178},"Object.prototype.toString.call(value)",{"type":793,"value":2180}," как более универсальный способ",{"type":788,"tag":1123,"props":2182,"children":2185},{"className":2183,"code":2184,"language":793},[1126],"function tagOf(v) {\n  return Object.prototype.toString.call(v);\n}\n\nconsole.log(tagOf([]));            // \"[object Array]\"\nconsole.log(tagOf({}));            // \"[object Object]\"\nconsole.log(tagOf(new Date()));    // \"[object Date]\"\nconsole.log(tagOf(null));          // \"[object Null]\"\nconsole.log(tagOf(undefined));     // \"[object Undefined]\"\n",[2186],{"type":788,"tag":802,"props":2187,"children":2188},{"__ignoreMap":1131},[2189],{"type":793,"value":2184},{"data":2191,"body":2192},{},{"type":785,"children":2193},[2194,2199,2208],{"type":788,"tag":789,"props":2195,"children":2196},{},[2197],{"type":793,"value":2198},"Примитивные значения копируются “как значение”, а объекты передаются как ссылка на один и тот же объект. Это особенно важно при присваивании и передаче в функции.",{"type":788,"tag":1123,"props":2200,"children":2203},{"className":2201,"code":2202,"language":793},[1126],"// Примитив: копия значения\nlet a = 10;\nlet b = a;\nb = 20;\n\nconsole.log(a); // 10\nconsole.log(b); // 20\n\n// Объект: копия ссылки\nlet o1 = { count: 1 };\nlet o2 = o1;\no2.count = 2;\n\nconsole.log(o1.count); // 2\nconsole.log(o2.count); // 2\n",[2204],{"type":788,"tag":802,"props":2205,"children":2206},{"__ignoreMap":1131},[2207],{"type":793,"value":2202},{"type":788,"tag":789,"props":2209,"children":2210},{},[2211,2213,2219,2221,2227],{"type":793,"value":2212},"Чтобы получить “поверхностную” копию объекта, часто используется ",{"type":788,"tag":802,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":793,"value":2218},"structuredClone",{"type":793,"value":2220}," (глубокая копия, где поддерживается) или комбинации вроде ",{"type":788,"tag":802,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":793,"value":2226},"Object.assign",{"type":793,"value":2228},"/spread для поверхностной копии.",{"data":2230,"body":2231},{},{"type":785,"children":2232},[2233],{"type":788,"tag":789,"props":2234,"children":2235},{},[2236],{"type":793,"value":123},{"data":2238,"body":2239},{},{"type":785,"children":2240},[2241],{"type":788,"tag":1123,"props":2242,"children":2245},{"className":2243,"code":2244,"language":793},[1126],"const original = { inner: { x: 1 } };\nconst shallow = { ...original };\n\nshallow.inner.x = 999;\n\nconsole.log(original.inner.x); // 999 (вложенный объект общий)\n",[2246],{"type":788,"tag":802,"props":2247,"children":2248},{"__ignoreMap":1131},[2249],{"type":793,"value":2244},{"data":2251,"body":2252},{},{"type":785,"children":2253},[2254],{"type":788,"tag":922,"props":2255,"children":2256},{},[2257,2283,2301,2319,2330],{"type":788,"tag":926,"props":2258,"children":2259},{},[2260,2262,2267,2269,2275,2277],{"type":793,"value":2261},"Ожидание, что ",{"type":788,"tag":802,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":793,"value":52},{"type":793,"value":2268}," даст ",{"type":788,"tag":802,"props":2270,"children":2272},{"className":2271},[],[2273],{"type":793,"value":2274},"typeof null === \"null\"",{"type":793,"value":2276},", хотя фактически возвращается ",{"type":788,"tag":802,"props":2278,"children":2280},{"className":2279},[],[2281],{"type":793,"value":2282},"\"object\"",{"type":788,"tag":926,"props":2284,"children":2285},{},[2286,2288,2293,2295],{"type":793,"value":2287},"Попытка хранить “большие целые” в ",{"type":788,"tag":802,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":793,"value":70},{"type":793,"value":2294}," без потери точности, хотя безопасный диапазон ограничен ",{"type":788,"tag":802,"props":2296,"children":2298},{"className":2297},[],[2299],{"type":793,"value":2300},"Number.MAX_SAFE_INTEGER",{"type":788,"tag":926,"props":2302,"children":2303},{},[2304,2306,2311,2312,2317],{"type":793,"value":2305},"Смешивание ",{"type":788,"tag":802,"props":2307,"children":2309},{"className":2308},[],[2310],{"type":793,"value":76},{"type":793,"value":1297},{"type":788,"tag":802,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":793,"value":70},{"type":793,"value":2318}," в арифметике без преобразования",{"type":788,"tag":926,"props":2320,"children":2321},{},[2322,2324],{"type":793,"value":2323},"Ожидание, что массив — отдельный тип, хотя он является объектом и проверяется через ",{"type":788,"tag":802,"props":2325,"children":2327},{"className":2326},[],[2328],{"type":793,"value":2329},"Array.isArray",{"type":788,"tag":926,"props":2331,"children":2332},{},[2333,2335,2341,2342,2348,2349,2354],{"type":793,"value":2334},"Использование объектов-оберток ",{"type":788,"tag":802,"props":2336,"children":2338},{"className":2337},[],[2339],{"type":793,"value":2340},"new Number(1)",{"type":793,"value":1075},{"type":788,"tag":802,"props":2343,"children":2345},{"className":2344},[],[2346],{"type":793,"value":2347},"new String(\"x\")",{"type":793,"value":1075},{"type":788,"tag":802,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":793,"value":1755},{"type":793,"value":2355}," вместо примитивов",{"data":2357,"body":2358},{},{"type":785,"children":2359},[2360],{"type":788,"tag":789,"props":2361,"children":2362},{},[2363,2365,2370,2371,2376,2377,2382,2383,2388,2389,2394,2395,2400,2401,2406,2408,2413,2415,2420,2422,2428,2430,2435,2437,2442],{"type":793,"value":2364},"Кратко: В JavaScript существует 8 типов данных: 7 примитивов (",{"type":788,"tag":802,"props":2366,"children":2368},{"className":2367},[],[2369],{"type":793,"value":40},{"type":793,"value":1075},{"type":788,"tag":802,"props":2372,"children":2374},{"className":2373},[],[2375],{"type":793,"value":52},{"type":793,"value":1075},{"type":788,"tag":802,"props":2378,"children":2380},{"className":2379},[],[2381],{"type":793,"value":58},{"type":793,"value":1075},{"type":788,"tag":802,"props":2384,"children":2386},{"className":2385},[],[2387],{"type":793,"value":70},{"type":793,"value":1075},{"type":788,"tag":802,"props":2390,"children":2392},{"className":2391},[],[2393],{"type":793,"value":76},{"type":793,"value":1075},{"type":788,"tag":802,"props":2396,"children":2398},{"className":2397},[],[2399],{"type":793,"value":88},{"type":793,"value":1075},{"type":788,"tag":802,"props":2402,"children":2404},{"className":2403},[],[2405],{"type":793,"value":97},{"type":793,"value":2407},") и 1 непримитивный (",{"type":788,"tag":802,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":793,"value":103},{"type":793,"value":2414},"). Массивы и функции относятся к ",{"type":788,"tag":802,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":793,"value":103},{"type":793,"value":2421}," (функции имеют ",{"type":788,"tag":802,"props":2423,"children":2425},{"className":2424},[],[2426],{"type":793,"value":2427},"typeof === \"function\"",{"type":793,"value":2429},"), а ",{"type":788,"tag":802,"props":2431,"children":2433},{"className":2432},[],[2434],{"type":793,"value":1250},{"type":793,"value":2436}," — историческое исключение, возвращающее ",{"type":788,"tag":802,"props":2438,"children":2440},{"className":2439},[],[2441],{"type":793,"value":2282},{"type":793,"value":911},{"data":2444,"body":2445},{},{"type":785,"children":2446},[2447],{"type":788,"tag":789,"props":2448,"children":2449},{},[2450],{"type":788,"tag":802,"props":2451,"children":2453},{"className":2452},[],[2454],{"type":793,"value":40},{"data":2456,"body":2457},{},{"type":785,"children":2458},[2459],{"type":788,"tag":789,"props":2460,"children":2461},{},[2462],{"type":788,"tag":802,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":793,"value":1006},{"data":2468,"body":2469},{},{"type":785,"children":2470},[2471],{"type":788,"tag":789,"props":2472,"children":2473},{},[2474],{"type":788,"tag":802,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":793,"value":52},{"data":2480,"body":2481},{},{"type":785,"children":2482},[2483],{"type":788,"tag":789,"props":2484,"children":2485},{},[2486],{"type":788,"tag":802,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":793,"value":103},1775735661830]