{"id":231781,"date":"2023-01-12T11:57:00","date_gmt":"2023-01-12T08:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231781"},"modified":"2022-11-10T05:11:50","modified_gmt":"2022-11-10T02:11:50","slug":"5-tipptasemel-javascripti-funktsiooni-koodi-taeiustamiseks","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/5-tipptasemel-javascripti-funktsiooni-koodi-taeiustamiseks\/","title":{"rendered":"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks"},"content":{"rendered":"\n<p>JavaScripti funktsioonid kasvavad pidevalt ja saavad uusi, nagu operaatorid, s\u00fcntaksikonstruktsioonid, avaldised. Paljud neist on viimastel aastatel kasutusele v\u00f5etud ja m\u00f5ned neist on juba teist laadi, n\u00e4iteks rasva noole <code>=&gt;<\/code>avaldis v\u00f5i objekti levitamise <code>...<\/code>operaator.<\/p>\n<h2>JavaScripti funktsioonid algavad ettepanekutest<\/h2>\n<p>K\u00f5ik need JavaScripti funktsioonid algavad TC 39-le esitatud ettepanekutest. <a href=\"https:\/\/www.ecma-international.org\/memento\/tc39-rf-tg.htm\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Tehniline komitee 39<\/a> vastutab standardimise eest:<\/p>\n<blockquote>\n<p>\u00fcldotstarbeline, platvormidevaheline, m\u00fc\u00fcja-neutraalne programmeerimiskeel ECMAScript (JavaScript). See h\u00f5lmab keele s\u00fcntaksit, semantikat ning keelt toetavaid teeke ja t\u00e4iendavaid tehnoloogiaid.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/babeljs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">T\u00e4nu JavaScripti kompilaatorile Babel<\/a> on palju JavaScripti ettepanekuid, mida saame t\u00e4na oma voogu lisada. M\u00f5ned neist pakuvad rohkem selgust, n\u00e4iteks numbriline eraldaja. Teised, nagu <code>do<\/code>avaldised, tutvustavad v\u00f5imalust segada React JSX-i siltidega keerulisi tingimustingimusi.<\/p>\n<p>Vaatame selles artiklis 5 JavaScripti funktsiooni, mis on veel ettepaneku staadiumis, kuid mida saame Babeliga kasutada ja mis parandavad oluliselt teie kodeerimiskogemust.<\/p>\n<p>Igal neist on link oma Babeli lehele, kus n\u00e4ete, kuidas Paabelit seda kasutama konfigureerida, kuigi siin kirjeldatud JavaScripti pakutavad funktsioonid on juba Babel 7-ga kaasatud. Igal jaotisel on ka link oma ettepanekule <a href=\"https:\/\/github.com\/tc39\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ecma TC39<\/a> organisatsioonis <a href=\"https:\/\/startfunction.com\/tag\/github\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GitHub<\/a>.<\/p>\n<h2>Nullh coalescing operaator<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" alt=\"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks\" ><\/a><\/p>\n<p>Ettepanek: <a href=\"https:\/\/github.com\/tc39\/proposal-nullish-coalescing\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-nullish-coalescing<\/a><\/p>\n<p>Paabel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html<\/a><\/p>\n<p>See JavaScripti ettepanek kirjeldab operaatorit, mis v\u00f5imaldab anda operaatori paremal k\u00fcljel varuv\u00e4\u00e4rtuse, kui muutuja v\u00f5i objekti atribuut on m\u00e4\u00e4ratlemata. Kui see pole m\u00e4\u00e4ratlemata, kasutab see operaatori vasakut poolt:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef ?? 2021; <\/code><\/pre>\n<p>See sarnaneb kolmepoolse operaatorina kirjutamisega:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef? maybeUndef: 2021; <\/code><\/pre>\n<p>Pange t\u00e4hele, et see operaator ei kontrolli, kas vari ei eksisteeri. See annab veateate:<\/p>\n<pre><code>const val = maybeUndef ?? 2021;  <\/code><\/pre>\n<p>Kuid ettevaatlik, see operaator ei ole 100% nagu kolmekomponentne operaator, mis tagastab esimese k\u00fclje, kui hinnatud tingimus on t\u00f5ene. See ei hinda v\u00e4\u00e4rtusi, mis tavaliselt on <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScriptis<\/a> valed, v\u00e4\u00e4rtusele <code>false<\/code>. N\u00e4iteks t\u00fchja stringi ei v\u00f5eta arvesse <code>false<\/code>:<\/p>\n<pre><code>const someEmptyString = '';\nconst val = someEmptyString ?? 'fallback'; <\/code><\/pre>\n<p>Erinevalt nullist koalesseerimisoperaatorist oleks <code>fallback<\/code>selle hindamise tulemusel visanud kolmepoolne operaator.<\/p>\n<h2>Valikuline aheldamisoperaator<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" alt=\"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks\" ><\/a><\/p>\n<p>Ettepanek: <a href=\"https:\/\/github.com\/tc39\/proposal-optional-chaining\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-optional-chaining<\/a><\/p>\n<p>Paabel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-optional-chaining.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-optional-chaining.html<\/a><\/p>\n<p>See operaator t\u00f6\u00f6tab ka muutujate ja objekti omadustega: see kontrollib, kas pesastatud omadused, mida me l\u00e4bime, on olemas v\u00f5i mitte. Ilma selle operaatorita peame kontrollima iga pesastatud atribuuti:<\/p>\n<pre><code>const val = anObj &amp;&amp; anObj.aProp &amp;&amp; anObj.aProp.aNestedProp<\/code><\/pre>\n<p>Uue valikulise kettimise operaatoriga saame teha midagi sellist:<\/p>\n<pre><code>const val = anObj.aProp?.aNestedProp<\/code><\/pre>\n<p>See tundub palju selgem ja kirjutamine on l\u00fchem. See operaator t\u00f6\u00f6tab ka numbrimassiividega, seega on hea kogudega t\u00f6\u00f6tada:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp<\/code><\/pre>\n<p>Ja me saame virnastada mitu operaatorit:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp?.aNestedProp<\/code><\/pre>\n<p>Ja mis siis, kui me \u00fchendame selle eelmise, nullilise \u00fchendamisega? Saame s\u00fcntaksi, mis kontrollib iga l\u00e4bitud atribuudi olemasolu ja kui seda ei ole, annab varuv\u00e4\u00e4rtuse:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp ?? 'someDefaultValue'<\/code><\/pre>\n<p>Kui m\u00f5ni v\u00e4\u00e4rtustest puudub, tagastatakse see <code>someDefaultValue<\/code>. Nende kahe operaatori kombineerimine on suurep\u00e4rane viis lodashi <a href=\"https:\/\/lodash.com\/docs#get\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get funktsiooni<\/a> asendamiseks .<\/p>\n<h2>Torujuhtme operaator<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" alt=\"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks\" ><\/a><\/p>\n<p>Ettepanek: <a href=\"https:\/\/github.com\/tc39\/proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-pipeline-operator<\/a><\/p>\n<p>Paabel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-op<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rator<\/a><\/p>\n<p>See operaator on osa mitmest eksperimentaalsest JavaScripti funktsioonist ja see pakub mitme funktsiooni aheldamisel paremat loetavust. Kaaluge j\u00e4rgmist funktsiooni:<\/p>\n<pre><code>const reverseWords = \n      str =&gt; str\n        .split( ' ') .reduce( (revStr, word) =&gt; [ word, ...revStr ], []) .join( ' ' );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p>Kui meil on vaja neid kokku aheldatud osateisendusi uuesti kasutada, saame need jagada erinevateks funktsioonideks ja seej\u00e4rel nende abil tulemuse koostada:<\/p>\n<pre><code>const splitBySpace = str =&gt; str.split( ' ' );\nconst reverseArray = arr =&gt; arr.reduce( (acc, cur) =&gt; [ cur, ...acc ], [] );\nconst joinWithSpace = arr =&gt; arr.join( ' ' );\n\nconst reverseWords =\n    str =&gt; joinWithSpace(\n        reverseArray(\n            splitBySpace(\n                str)) );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p><code>splitBySpace<\/code>Selle juures on veider see, et stringile rakendatud teisenduste m\u00f5istmiseks peame hakkama seda lugema alt, reast \u00fclespoole. See on vastuolus meie loomuliku lugemisvooluga, \u00fclalt alla. Samuti l\u00f5petame k\u00f5igi nende inetute rippuvate sulgudega. Selle v\u00f5iks kirjutada \u00fche reaga ja see pole palju ilusam:<\/p>\n<pre><code>const reverseWords = str =&gt; joinWithSpace( reverseArray( splitBySpace( str)) );<\/code><\/pre>\n<p>Siin peame alustama lugemist keskfunktsioonist v\u00e4limiste funktsioonide suunas v\u00f5i paremalt vasakule, mis on l\u00e4\u00e4ne vasakult paremale lugemise jaoks vastupidine.<\/p>\n<p>Torujuhtme operaator saab muuta need konstruktsioonid palju loetavamaks ja sarnaseks aheldamisega, mis meil algselt oli enne teisenduste teisaldamist eraldi funktsioonidesse:<\/p>\n<pre><code>const reverseWords =\n    str =&gt; str\n        |&gt; splitBySpace\n        |&gt; reverseArray\n        |&gt; joinWithSpace;<\/code><\/pre>\n<p>N\u00fc\u00fcd on rakendatud teisendused kirjutatud sarnaselt meie kirjutamisviisiga, \u00fclalt alla, neid on paremini lugeda ja meil pole \u00fchtegi sulgu rippumas. Edu!<\/p>\n<h2>Numbriline eraldaja<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" alt=\"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks\" ><\/a><\/p>\n<p>Ettepanek: <a href=\"https:\/\/github.com\/tc39\/proposal-numeric-separator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-numeric-separator<\/a><\/p>\n<p>Paabel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html<\/a><\/p>\n<p>See numbriline eraldaja erineb teistest JavaScripti funktsioonidest, kuna see ei ole operaator. See on s\u00fcntaksikonstruktsioon, mis muudab numbrilised literaalid loetavamaks, luues numbrir\u00fchmade visuaalse eraldamise. Suuri arvulisi literaale on raske s\u00f5eluda ja kiiresti m\u00f5ista, eriti kui numbrit korratakse mitu korda. N\u00e4iteks:<\/p>\n<pre><code>const longNum = 1000000000000;<\/code><\/pre>\n<p>Kiire pilguga on raske aru saada. See eraldaja muudab selle loetavamaks:<\/p>\n<pre><code>const longNum = 1_000_000_000_000;<\/code><\/pre>\n<p>N\u00fc\u00fcd saame kiiresti aru, et see on triljon.<\/p>\n<h2>Tehke v\u00e4ljendeid<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" alt=\"5 tipptasemel JavaScripti funktsiooni koodi t\u00e4iustamiseks\" ><\/a><\/p>\n<p>Ettepanek: <a href=\"https:\/\/github.com\/tc39\/proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-do-expressions<\/a><\/p>\n<p>Paabel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions<\/a><\/p>\n<p>Viimane uutest JavaScripti funktsioonidest, mida me l\u00e4bime, on avaldis, mida saab hinnata. Selle avaldise tulemus tuleb p\u00e4rast ploki t\u00e4itmist, milles v\u00f5ib olla mitu lauset. Saame h\u00f5lpsasti aru do-avaldistest, kui t\u00f5lgime sellise kolmeosalise operaatori avaldise:<\/p>\n<pre><code>const res = isCold( color )? 'light-blue': 'orange';<\/code><\/pre>\n<p>Kirjutaksime samav\u00e4\u00e4rse <code>do{}<\/code>avaldise j\u00e4rgmiselt:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else {\n        'orange';\n    }\n};<\/code><\/pre>\n<p>Pange t\u00e4hele, et me ei pea v\u00e4\u00e4rtust tagastama, kuna see pole funktsioon. Kui sel konkreetsel juhul saab selle kolmeosalisemalt kirjutada, on do-avaldised palju v\u00f5imsamad, v\u00f5imaldades n\u00e4iteks mitut avaldust:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else if (isHot( color)) {\n        'orange';\n    } else if (isRain( color)) {\n        'purple';\n    } else {\n        'green';\n    }\n};<\/code><\/pre>\n<p>See on t\u00f5esti v\u00f5imas JSX-is, kus saame selle selle siltidega segada, ilma et peaksime tulemust esmalt v\u00e4liselt arvutama. N\u00e4iteks kui kasutaksime nende komponentide renderdamiseks <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Reacti, saaksime teha j\u00e4rgmist.<\/a><\/p>\n<pre><code>const MyComp = ({ color }) =&gt; ({\n            do {\n                if (isCold( color)) {\n                    ;\n                } else if (isHot( color)) {\n                    ;\n                } else if (isRain( color)) {\n                    ;\n                } else {\n                    ;\n                }\n            }\n        }\n\n);<\/code><\/pre>\n<h2>Veel JavaScripti ettepanekuid<\/h2>\n<p>Iga p\u00e4ev arutatakse rohkem ettepanekuid JavaScripti keelele huvitavamate funktsioonide lisamiseks. Nende pakutud JavaScripti funktsioonide j\u00e4rjest suurenevat loendit saab lugeda aadressil <a href=\"https:\/\/github.com\/tc39\/proposals#ecmascript-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposals#ecmascript-proposals<\/a>. Siin esitatud ettepanekud on peaaegu l\u00f5pule j\u00f5udmas ja seega peaaegu lisamisele ECMAScripti standardisse, nagu on selgitatud selles <a href=\"https:\/\/tc39.es\/process-document\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aktsepteerimisprotsessi<\/a> kirjeldavas tabelis .<\/p>\n<p>M\u00f5ned uued JavaScripti funktsioonid, mida me selles artiklis uurisime, nagu do-avaldised v\u00f5i konveierioperaator, on <a href=\"https:\/\/github.com\/tc39\/proposals\/blob\/master\/stage-1-proposals.md#stage-1-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">1 etapi ettepanekud<\/a>, mis t\u00e4hendab, et enne ECMAScripti standardi osaks saamist on neil veel palju teha.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lugege 5 uue JavaScripti funktsiooni, operaatori ja avaldise kohta, mis parandavad teie koodi, muutes selle loetavamaks ja t\u00f5husamaks.<\/p>\n","protected":false},"author":1,"featured_media":157555,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,749,729,894,842],"tags":[1165],"class_list":["post-231781","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-avatud-laehtekoodiga","category-javascript-4","category-kood","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=231781"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231781\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/157555"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=231781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=231781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=231781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}