{"componentChunkName":"component---src-templates-post-js","path":"/javascript/luchshie-sovety-i-ulovki-javascript/","result":{"pageContext":{"slug":"luchshie-sovety-i-ulovki-javascript","content":"\n<p id=\"3a56\">По факту эти техники сохранят вам кучу времени.</p>\n\n\n\n<p id=\"e9b2\">Возможно большинство из них вам уже знакомо, возможно некоторые нет. Но в любом случае, они будут вам крайне полезны.</p>\n\n\n\n<p id=\"82e8\">Это переводы трех статей, которые действительно помогут вам писать лучше, быстрее и продуктивнее.</p>\n\n\n\n<p class=\"author\"><em>Перевод первой статьи&nbsp;</em><a href=\"https://medium.freecodecamp.org/9-neat-javascript-tricks-e2742f2735c3\"><em>Learn these neat JavaScript tricks in less than 5 minutes</em></a></p>\n\n\n\n<h2 id=\"d45d\"><strong>Очистка и сокращение массива</strong></h2>\n\n\n\n<p id=\"6e55\">Вот простой способ очистки или сокращения массива его переназначения. Вы можете просто поменять его&nbsp;<code>length</code>&nbsp;свойство:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const arr = &#91;11, 22, 33, 44, 55, 66];\n  // Сокращение\narr.length = 3;\nconsole.log(arr); //=> &#91;11, 22, 33]\n  // Очистка\narr.length = 0;\nconsole.log(arr); //=> &#91;]\nconsole.log(arr&#91;2]); //=> undefined</code></pre>\n\n\n\n<h2 id=\"96fc\"><strong>Имитация параметров с помощью деструктуризации</strong></h2>\n\n\n\n<p id=\"16fd\">Велик шанс того, что вы уже используете конфигурацию объектов, когда вам надо передать переменный набор аргументов для функции, например как тут:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>doSomething({ foo: 'Hello', bar: 'Hey!', baz: 42 });\nfunction doSomething(config) {  \n    const foo = config.foo !== undefined ? config.foo : 'Hi';  \n    const bar = config.bar !== undefined ? config.bar : 'Yo!';  \n    const baz = config.baz !== undefined ? config.baz : 13;  // ...}</code></pre>\n\n\n\n<p>Это старый, но эффективный паттерн, который пытается имитировать именованные параметры в JavaScript. Вызов функции выглядит хорошо. С другой стороны,&nbsp;<em>объект конфигурация</em>&nbsp;содержит логику, которая занимает ну уж слишком много писанины. А вот помощью ES2015 деструктуризации, вы можете обойти этот недостаток:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>function doSomething({ foo = 'Hi', bar = 'Yo!', baz = 13 }) {  // ...}\nИ если вам нужно сделать конфиг объекта опциональным, но это тоже очень просто:\nfunction doSomething({ foo = 'Hi', bar = 'Yo!', baz = 13 } = {}) {  // ...}</code></pre>\n\n\n\n<h2 id=\"4df6\"><strong>Деструктуризация объекта для элементов массива</strong></h2>\n\n\n\n<p id=\"81aa\">Назначайте элементы массива индивидуальным переменным с помощью деструктуризации объектов:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const csvFileLine = '1997,John Doe,US,john@doe.com,New York';\nconst { 2: country, 4: state } = csvFileLine.split(',');</code></pre>\n\n\n\n<h2 id=\"8877\"><strong>Асинхронные функции с async/await</strong></h2>\n\n\n\n<p id=\"6c04\">Да, есть возможно обождать множественную асинхронную функцию, используя&nbsp;<code>Promise.all</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>await Promise.all(&#91;anAsyncCall(), thisIsAlsoAsync(), oneMore()])\n</code></pre>\n\n\n\n<h2 id=\"a27f\"><strong>Создание пустых объектов</strong></h2>\n\n\n\n<p id=\"eea1\">Вы можете создать 100% пустой объект, который не будет наследовать какие-либо свойства или методы из изначального объекта (например,&nbsp;<code>constructor</code>,&nbsp;<code>toString()</code>&nbsp;и так далее).</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const pureObject = Object.create(null);\nconsole.log(pureObject); //=> {}\nconsole.log(pureObject.constructor); //=> undefined\nconsole.log(pureObject.toString); //=> undefined\nconsole.log(pureObject.hasOwnProperty); //=> undefined\n</code></pre>\n\n\n\n<h2 id=\"331b\"><strong>Форматирование кода JSON</strong></h2>\n\n\n\n<p id=\"bfcf\"><code>JSON.stringify</code>&nbsp;может не просто конвертировать объект в строку. А так же может сделать красивую выдачу JSON:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const obj = {\nfoo: { bar: &#91;11, 22, 33, 44], baz: { bing: true, boom: ‘Hello’ } }\n};\n// Третий параметр это чисто пробелов, используемое для украшения JSON вывода\nJSON.stringify(obj, null, 4);\n// =>”{\n// => “foo”: {\n// => “bar”: &#91;\n// => 11,\n// => 22,\n// => 33,\n// => 44\n// => ],\n// => “baz”: {\n// => “bing”: true,\n// => “boom”: “Hello”\n// => }\n// => }\n// =>}”</code></pre>\n\n\n\n<h2 id=\"f1da\"><strong>Удаление дублирующихся элементов из массива</strong></h2>\n\n\n\n<p id=\"03a2\">Используя сеты ES2015 вместе с оператором расширения, вы легко можете удалить дублирующиеся элементы из массива:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const removeDuplicateItems = arr => &#91;…new Set(arr)];\nremoveDuplicateItems(&#91;42, 'foo', 42, 'foo', true, true]);\n//=> &#91;42, \"foo\", true]</code></pre>\n\n\n\n<h2 id=\"6a52\"><strong>Слияние многоуровневых массивов</strong></h2>\n\n\n\n<p id=\"a4b8\">Вообще слияние многоуровневых массивов довольно тривиально с помощью оператора расширения:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const arr = &#91;11, &#91;22, 33], &#91;44, 55], 66];\nconst flatArr = &#91;].concat(…arr); //=> &#91;11, 22, 33, 44, 55, 66]</code></pre>\n\n\n\n<p>К сожалению, трюк выше сработает только на двухуровневых массивах. Но с рекурсивными запросами, мы можем применить это для массивов с более чем двумя уровнями:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>function flattenArray(arr) {\n  const flattened = &#91;].concat(...arr);\n  return flattened.some(item => Array.isArray(item)) ?      flattenArray(flattened) : flattened\n;}\nconst arr = &#91;11, &#91;22, 33], &#91;44, &#91;55, 66, &#91;77, &#91;88]], 99]]];\nconst flatArr = flattenArray(arr);\n//=> &#91;11, 22, 33, 44, 55, 66, 77, 88, 99]</code></pre>\n\n\n\n<p class=\"author\"><em>Перевод второй статьи&nbsp;</em><a href=\"https://medium.com/dailyjs/7-hacks-for-es6-developers-4e24ff425d0b\"><em>7 Hacks for ES6 Developers</em></a></p>\n\n\n\n<h2 id=\"6d81\"><strong>Перетасовка переменных</strong></h2>\n\n\n\n<p id=\"f496\">Используйте деструктуризацию массивов для перетасовки переменных. Тут все будет понятно из кода:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let a = 'world', b = 'hello'\n&#91;a, b] = &#91;b, a]\nconsole.log(a) // -> hello\nconsole.log(b) // -> world\n// Да, это магия, детка!</code></pre>\n\n\n\n<h2 id=\"27a0\">Деструктуризация с async/await</h2>\n\n\n\n<p id=\"793f\">И снова, деструктуризация массивов просто шедевральна. Вместе с&nbsp;<code>async/await</code>&nbsp;она делает невообразимые вещи.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const &#91;user, account] = await Promise.all(&#91;\n  fetch('/user'),\n  fetch('/account')\n])</code></pre>\n\n\n\n<h2 id=\"fdde\"><strong>Дебаггинг</strong></h2>\n\n\n\n<p id=\"f76f\">Для всех кто любит дебаггинг с помощью&nbsp;<code>console.log</code>, вот вам крутой пример и да, я слышал про&nbsp;<code>console.table</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const a = 5, b = 6, c = 7\nconsole.log({ a, b, c })\n// выдаёт объект:\n// {\n//    a: 5,\n//    b: 6,\n//    c: 7\n// }</code></pre>\n\n\n\n<h2 id=\"2044\"><strong>Однострочники</strong></h2>\n\n\n\n<p id=\"3dc8\">Синтаксис может быть гораздо компактнее для операций с массивами.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Найти максимальное значение\nconst max = (arr) => Math.max(…arr);\nmax(&#91;123, 321, 32]) // вывод: 321\n// Сумма массива\nconst sum = (arr) => arr.reduce((a, b) => (a + b), 0)\nsum(&#91;1, 2, 3, 4]) // вывод: 10</code></pre>\n\n\n\n<h2 id=\"df0b\"><strong>Конкатенация(слияние) массивов</strong></h2>\n\n\n\n<p id=\"2419\">Вообще оператор расширения может использоваться вместо <code>concat</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const one = &#91;'a', 'b', 'c']\nconst two = &#91;'d', 'e', 'f']\nconst three = &#91;'g', 'h', 'i']\n// старый способ #1\nconst result = one.concat(two, three)\n// старый способ #2\nconst result = &#91;].concat(one, two, three)\n// новый\nconst result = &#91;...one, ...two, ...three]</code></pre>\n\n\n\n<h2 id=\"8f3c\"><strong>Клонирование</strong></h2>\n\n\n\n<p id=\"c4d0\">Клонирование массивов и объектов с легкостью:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const obj = { …oldObj }\nconst arr = &#91; …oldArr ]</code></pre>\n\n\n\n<h2 id=\"9789\"><strong>Именованные параметры</strong></h2>\n\n\n\n<p id=\"ad26\">Создание функции и ее вызов можно сделать более читабельным с помощью деструктуризации:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const getStuffNotBad = (id, force, verbose) => {\n  ...do stuff\n}\nconst getStuffAwesome = ({ id, name, force, verbose }) => {\n  ...do stuff\n}\n// Где то там в коде, что такое вообще true, true и к чему оно?\ngetStuffNotBad(150, true, true)\n// А вот уже по другому... I ❤ JS!!!\ngetStuffAwesome({ id: 150, force: true, verbose: true })</code></pre>\n\n\n\n<p>И третья, бонусная статья аж 2013-го года. Все эти практики уже давно знакомы, но все же самые интересные из них не помешает закрепить.</p>\n\n\n\n<p class=\"author\"><em>Перевод статьи&nbsp;</em><a href=\"https://hackernoon.com/javascript-hacks-for-hipsters-624d50c76e8e\"><em>Javascript Hacks for Hipsters</em></a></p>\n\n\n\n<h2 id=\"d5fa\"><strong>Вызов метода</strong></h2>\n\n\n\n<p id=\"55e2\">Я реально не люблю блоки&nbsp;<code>if</code>/<code>else</code>&nbsp;и это довольно полезный трюк для вызова нужной функции, основываясь на булиных значениях.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Скукота\nif (success) {\n  obj.start();\n} else {\n  obj.stop();\n}\n\n// По-хипстерски\nvar method = (success ? 'start' : 'stop');\nobj&#91;method]();</code></pre>\n\n\n\n<h2 id=\"c36f\"><strong>Совмещаем строки</strong></h2>\n\n\n\n<p id=\"7993\">Известный факт, что строки подобны другим строкам. И рано или поздно вы бы захотели связать две или более из них. Мне действительно не нравится работа с плюсом, по-этому&nbsp;<code>join()</code>&nbsp;приходит на помощь.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&#91;'first', 'name'].join(' '); // = 'first name';\n\n&#91;'milk', 'coffee', 'sugar'].join(', '); // = 'milk, coffee, sugar'</code></pre>\n\n\n\n<h2 id=\"8796\"><strong>Дефолтный оператор</strong></h2>\n\n\n\n<p id=\"307b\">JavaScript сам по себе не знает, что содержит объект. Иногда вы получаете его как аргумент функции, в другой раз вы можете прочесть его из сети или из файла конфигурации. В любом случае, вы можете использовать&nbsp;<code>||</code>&nbsp;оператор, чтобы использовать второй аргумент, если первый выдает&nbsp;<code>false</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Ставим по дефолту 'No name' когда myName пуст (или null, или undefined)\nvar name = myName || 'No name';\n\n\n// Убеждаемся, есть ли у нас объект options\nvar doStuff = function(options) {\n  options = options || {};\n  // ...\n};</code></pre>\n\n\n\n<h2 id=\"010c\"><strong>Оператор на страже точности &amp;&amp;</strong></h2>\n\n\n\n<p id=\"73f2\">Схожий с дефолтным оператором, этот оператор супер полезен. Он исключает буквально все&nbsp;<code>if</code>&nbsp;запросы и делает код куда лучше.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>// Скучно\nif (isThisAwesome) {\n  alert('yes'); // нет\n}\n\n// Отлично\nisThisAwesome &amp;&amp; alert('yes');\n\n// Ещё один крутой подход\nvar aCoolFunction = undefined;\naCoolFunction &amp;&amp; aCoolFunction(); // не запустится и не закрэшится</code></pre>\n\n\n\n<p></p>\n","type":"js","date":"2020-10-28T12:52:30.000Z","acf":{"seo_desc":"Лучшие советы и уловки JavaScript, которые сохранят вам кучу времени и будут крайне полезны в работе","keywords":"советы и уловки JavaScript, трюки JavaScript, полезные советы по JavaScript","pub_date":"2018-07-04","tags":"JavaScript, JavaScript советы"},"title":"Лучшие советы и уловки JavaScript","id":"8a6751b2-7989-53d0-a5c0-5170ecbcf456","excerpt":"<p>По факту эти техники сохранят вам кучуко времени. Возможно большинство из них вам уже знакомо, возможно некоторые нет. Но в любом случае, они будут вам крайне полезны.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2020/10/DglYtvO7Bn0-5.jpg"},"interesting":[{"title":"Промисы в JavaScript для чайников","slug":"promisy-v-javascript-dlya-chainikov","type":"js"},{"title":"Самые необходимые строковые и числовые методы в JavaScript","slug":"samie-neobhodimie-strokovie-i-chislovie-metody-v-javascript","type":"js"},{"title":"Погружаемся в работу с children на React","slug":"pogruzhaemsya-v-raboty-s-children-na-react","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}