JavaScriptガむドパヌト6䟋倖、セミコロン、テンプレヌトリテラル

JavaScriptチュヌトリアル翻蚳のこの郚分のトピックは、䟋倖凊理、自動セミコロン機胜、およびテンプレヌトリテラルです。

→ パヌト1最初のプログラム、蚀語機胜、暙準
→ パヌト2コヌドスタむルずプログラム構造
→ パヌト3倉数、デヌタ型、匏、オブゞェクト
→ パヌト4機胜
→ パヌト5配列ずルヌプ
→ パヌト6䟋倖、セミコロン、ワむルドカヌドリテラル
→ パヌト7厳栌モヌド、このキヌワヌド、むベント、モゞュヌル、数孊蚈算
→ パヌト8ES6機胜の抂芁
→ パヌト9ES7、ES8、およびES9暙準の抂芁



䟋倖凊理


コヌドの実行䞭に問題が発生するず、JavaScriptで䟋倖ずしお衚されたす。 䟋倖を凊理する手段を講じない堎合、䟋倖が発生するず、プログラムが停止し、コン゜ヌルに゚ラヌメッセヌゞが衚瀺されたす。

次のコヌドスニペットを怜蚎しおください。

let obj = {value: 'message text'} let notObj let fn = (a) => a.value console.log(fn(obj)) //message text console.log('Before') //Before console.log(fn(notObj)) //,    console.log('After') 

ここに、 valueプロパティを持぀オブゞェクトを凊理するために䜿甚する予定の関数がありたす。 圌女はこのプロパティを返したす。 この関数を本来の目的、぀たり、動䜜するように蚭蚈されたオブゞェクトを転送するために䜿甚する堎合、実行時に゚ラヌは生成されたせん。 しかし、この䟋では宣蚀されおいるが初期化されおいない倉数に䞍適切なものを枡すず、 undefined倀のvalueプロパティにアクセスしようずするず゚ラヌが発生したす。 ゚ラヌメッセヌゞがコン゜ヌルに送信され、プログラムの実行が停止したす。

Node.jsでこのコヌドを実行するず、次のようになりたす。


Node.jsのTypeError䟋倖

WebペヌゞのJSコヌドでこのようなこずが発生した堎合、同様のメッセヌゞがブラりザヌコン゜ヌルに送信されたす。 これが実際のプログラムで発生する堎合、たずえば-Webサヌバヌコヌドでは、この動䜜は非垞に望たしくありたせん。 プログラムを停止するこずなく、゚ラヌをキャッチし、それを修正するための察策を講じるこずができるメカニズムがあれば䟿利です。 このようなメカニズムはJavaScriptに存圚し、 try...catchコンストラクトによっお衚されたす。

▍建蚭しよう...キャッチ


try...catchコンストラクトを䜿甚するず、䟋倖をキャッチしお凊理できたす。 ぀たり、゚ラヌを匕き起こす可胜性のあるコヌドを含むtryブロックず、゚ラヌが発生したずきに制埡が転送されるcatchが含たれたす。 tryブロックには、すべおのプログラムコヌドが含たれおいるわけではありたせん。 実行時゚ラヌを匕き起こす可胜性のある郚分はそこに配眮されたす。 たずえば、倖郚゜ヌスから受信した特定のデヌタを凊理する必芁がある関数の呌び出し。 そのようなデヌタの構造が関数で予想されるものず異なる堎合、゚ラヌが発生する可胜性がありたす。 これは、 try...catch構成スキヌムがどのようなものかを瀺しおいtry...catch 。

 try { // ,     } catch (e) { //  } 

コヌドが゚ラヌなしで実行された堎合、 catch 䟋倖ハンドラヌは実行されたせん。 ゚ラヌが発生した堎合、゚ラヌオブゞェクトがそこに転送され、この゚ラヌに察凊するためにいく぀かのアクションが実行されたす。

この䟋では、この構造を適甚しお、プログラムの危険なセクションfn()関数fn()呌び出されるセクションを保護したす。

 let obj = {value: 'message text'} let notObj let fn = (a) => a.value try {   console.log(fn(obj)) } catch (e) {   console.log(e.message) } console.log('Before') //Before try {   console.log(fn(notObj)) } catch (e) {   console.log(e.message) //Cannot read property 'value' of undefined } console.log('After') //After 

Node.jsでこのコヌドの結果を芋おみたしょう。


Node.jsでの゚ラヌ凊理

ご芧のずおり、この䟋を前の䟋ず比范するず、すべおのコヌドが実行され、問題の行の前にあるコヌドず、その行の埌にあるコヌドが実行されたす。 Errorオブゞェクトのmessageプロパティの倀をコン゜ヌルに出力するだけで、゚ラヌを「凊理」したす。 実際に䜿甚されるコヌドで発生した゚ラヌの凊理は、゚ラヌによっお異なりたす。

䞊蚘でtry...catchブロックに぀いお説明したしたが、実際には、この構造には別のブロックが含たれおいたすfinally 。

▍最埌にブロック


finallyブロックには、 tryブロックで実行されるコヌドで゚ラヌが発生したかどうかに関係なく実行されるコヌドが含たれおいたす。 倖芳は次のずおりです。

 try { //  } catch (e) { //  } finally { //  } 

finallyブロックは、 try...catch...finallyブロックにcatchブロックがない堎合にも䜿甚できたす。 このアプロヌチでは、たずえばtryブロックで占有されおいるリ゜ヌスを解攟するために、 catch䜿甚した構築ず同じ方法で䜿甚されたす。

▍ネストされたtryブロック


tryブロックは䞀緒にネストできたす。 この堎合、䟋倖は最も近いcatch凊理されcatch 。

 try { //  try {   //   } finally {   // -  } } catch (e) { } 

この堎合、内郚tryブロックで䟋倖が発生するず、倖郚catch凊理されcatch 。

▍自己生成の䟋倖


throwステヌトメントを䜿甚しお、自分で䟋倖をスロヌできたす。 倖芳は次のずおりです。

 throw value 

この呜什が実行された埌、制埡は最も近いcatch転送されcatch 。そのようなブロックが芋぀からない堎合、プログラムは停止したす。 䟋倖倀は䜕でもかたいたせん。 たずえば、ナヌザヌ定矩の゚ラヌオブゞェクト。

セミコロンに぀いお


JavaScriptでのセミコロンの䜿甚はオプションです。 䞀郚のプログラマヌはそれらを䜿甚せず、自動配眮システムに䟝存し、絶察に必芁な堎所にのみ配眮したす。 可胜な限りそれらを配眮するこずを奜む人もいたす。 この資料の著者は、セミコロンなしでやりたいプログラマヌのカテゎリヌに蚀及しおいたす。 圌は、2017幎の秋にそれらを䜿甚せず、明瀺的に挿入せずにどこでも削陀できるようにPrettierを蚭定するこずにしたず蚀いたす。 圌の意芋では、セミコロンなしのコヌドはより自然で読みやすいように芋えたす。

おそらく、JS開発者のコ​​ミュニティは、セミコロンに関しお2぀のキャンプに分かれおいるず蚀えたす。 同時に、明瀺的なセミコロンの配眮を芏定するJavaScriptスタむルガむドず、それらを䜿甚しないこずを掚奚するガむドもありたす。

JavaScriptには自動セミコロン自動セミコロン挿入、ASIのシステムがあるため、これはすべお可胜です。 ただし、JSコヌドでは、倚くの状況でこれらの文字を䜿甚せずに実行できるずいう事実、および実行のためにコヌドを準備するずきにセミコロンが自動的に配眮されるずいう事実は、プログラマヌがこれが発生する芏則を知る必芁がないずいう意味ではありたせん。 これらのルヌルを無芖するず゚ラヌが発生したす。

automatic自動セミコロンのルヌル


JavaScriptパヌサヌは、次の状況でプログラムテキストを解析するずきにセミコロンを自動的に远加したす。

  1. 次の行が珟圚のコヌドを䞭断するコヌドで始たる堎合特定のコマンドのコヌドは耇数の行にある堎合がありたす。
  2. 次の行が文字}で始たる堎合、珟圚のブロックを閉じたす。
  3. プログラムコヌドファむルの終わりが怜出されたずき。
  4. returnコマンドのある行。
  5. breakコマンドのある行。
  6. throwコマンドのある行。
  7. continueコマンドのある行。

expected期埅どおりに機胜しないコヌドの䟋


䞊蚘のルヌルを瀺す䟋をいく぀か瀺したす。 たずえば、次のコヌドフラグメントを実行した結果、䜕が出力されるず思いたすか

 const hey = 'hey' const you = 'hey' const heyYou = hey + ' ' + you ['h', 'e', 'y'].forEach((letter) => console.log(letter)) 

このコヌドを実行しようずするず、 Uncaught TypeError: Cannot read property 'forEach' of undefined゚ラヌがUncaught TypeError: Cannot read property 'forEach' of undefinedれたす。ルヌルNo. 1に基づいお、 Uncaught TypeError: Cannot read property 'forEach' of undefinedシステムのUncaught TypeError: Cannot read property 'forEach' of undefined 。次のようにコヌドを解釈しようずしたす。

 const hey = 'hey'; const you = 'hey'; const heyYou = hey + ' ' + you['h', 'e', 'y'].forEach((letter) => console.log(letter)) 

この問題は、最初の䟋の最埌から2番目の行の埌にセミコロンを眮くこずで解決できたす。

ここに別のコヌドがありたす。

 (1 + 2).toString() 

実行の結果は、文字列"3"出力になりたす。 しかし、次のコヌドスニペットにこのようなものが珟れたらどうなりたすか

 const a = 1 const b = 2 const c = a + b (a + b).toString() 

この堎合、 TypeError: b is not a function゚ラヌが衚瀺されたす。䞊蚘のコヌドは次のように解釈されるため、 TypeError: b is not a function 。

 const a = 1 const b = 2 const c = a + b(a + b).toString() 

ここで、ルヌル4に基づく䟋を芋おみたしょう。

 (() => { return {   color: 'white' } })() 

このIIFEはcolorプロパティを含むオブゞェクトを返すず思うかもしれたせんが、実際にはそうではありたせん。 代わりに、システムはreturnコマンドの埌にセミコロンを远加するため、関数はundefinedを返したす。

同様の問題を解決するには、オブゞェクトリテラルの巊䞭括匧をreturnコマンドず同じ行に配眮する必芁がありたす。

 (() => { return {   color: 'white' } })() 

次のコヌドフラグメントを芋るず、メッセヌゞボックスに0が衚瀺されおいるず思うかもしれたせん。

 1 + 1 -1 + 1 === 0 ? alert(0) : alert(2) 

ただし、ルヌル1に埓っおこのコヌドは次のように衚されるため、2を出力したす。

 1 + 1 -1 + 1 === 0 ? alert(0) : alert(2) 

JavaScriptでセミコロンを䜿甚する堎合は泚意が必芁です。 セミコロンの熱烈な支持者ずその敵に䌚うこずができたす。 実際、コヌドにセミコロンが必芁かどうかを刀断するずきは、JSが自動眮換をサポヌトしおいるずいう事実に頌るこずができたすが、コヌドで必芁かどうかは党員が自分で決定する必芁がありたす。 䞻なこずは、遞択したアプロヌチを䞀貫しお合理的に適甚するこずです。 セミコロンの配眮ずコヌドの構造に関しお、次の芏則を掚奚できたす。


䞀般に、セミコロンを自分で眮くか、自動配眮に䟝存するかにかかわらず、コヌドをテストしお、期埅どおりに動䜜するこずを確認するこずができたす。

匕甚笊ずワむルドカヌド文字


JavaScriptで匕甚笊を䜿甚する機胜に぀いお説明したしょう。 ぀たり、JSプログラムで蚱可されおいる次の皮類の匕甚に぀いお説明しおいたす。


䞀般に、䞀重匕甚笊ず二重匕甚笊は同じず芋なすこずができたす。

 const test = 'test' const bike = "bike" 

それらの間には実質的に違いはありたせん。 おそらく、唯䞀の顕著な違いは、単䞀匕甚笊で囲たれた文字列では、単䞀匕甚笊の文字を゚スケヌプする必芁があり、二重匕甚笊で囲たれた文字列では、文字が二重であるこずです。

 const test = 'test' const test = 'te\'st' const test = 'te"st' const test = "te\"st" const test = "te'st" 

さたざたなスタむルガむドで、単䞀匕甚笊の䜿甚に関する掚奚事項ず二重匕甚笊の䜿甚に関する掚奚事項の䞡方を芋぀けるこずができたす。 この資料の著者は、JSコヌドでは、単䞀匕甚笊のみを䜿甚し、二重匕甚笊はHTMLコヌドでのみ䜿甚するよう努めおいるず述べおいたす。

バックティックは、2015幎のES6暙準のリリヌスでJavaScriptに登堎したした。 他の新機胜の䞭でも特に、耇数行の文字列を簡単に蚘述するこずができたす。 このような文字列は、゚スケヌプシヌケンス\nを䜿甚しお、通垞の匕甚笊を䜿甚しお指定するこずもできたす。 こんな感じです。

 const multilineString = 'A string\non multiple lines' 

反転コンマ通垞、それらを入力するためのボタンはキヌボヌドの数字キヌ1の巊偎にありたすは\nなしで実行したす。

 const multilineString = `A string on multiple lines` 

しかし、逆匕甚笊の可胜性はこれに限定されたせん。 そのため、逆匕甚笊を䜿甚しお文字列を蚘述する堎合、 ${}構成を䜿甚しお、JS匏の蚈算結果の倀をそれに代入するこずができたす。

 const multilineString = `A string on ${1+1} lines` 

このような文字列は、テンプレヌトリテラルず呌ばれたす。

テンプレヌトリテラルには次の機胜がありたす。


これらの機胜に぀いお話したしょう。

▍耇数行テキスト


バッククォヌトで耇数行のテキストを蚭定するずき、そのようなテキストのスペヌスは他の文字ず同じくらい重芁であるこずを芚えおおく必芁がありたす。 たずえば、次の耇数行のテキストを考えたす。

 const string = `First               Second` 

圌の結論はおよそ以䞋を䞎えるでしょう。

 First               Second 

぀たり、このテキストが゚ディタヌに入力されたずきに、おそらくプログラマヌは、出力時にFirstずSecondずいう単語が厳密に互いの䞋に衚瀺されるこずを期埅しおいたしたが、実際はそうではありたせん。 この問題を回避するには、改行で耇数行テキストを開始し、逆匕甚笊を閉じた盎埌に、行の先頭たたは末尟にある空癜文字を削陀するtrim()メ゜ッドを呌び出しtrim() 。 このような文字には、特にスペヌスずタブが含たれたす。 行末文字も削陀されたす。

こんな感じです。

 const string = ` First Second`.trim() 

▍補間


ここでの補間ずは、倉数ず匏を文字列に倉換するこずを意味したす。 これは、 ${}構造を䜿甚しお行われたす。

 const variable = 'test' const string = `something ${ variable }` //something test 

匏も${} 、 ${}ブロックには䜕でも远加できたす。

 const string = `something ${1 + 2 + 3}` const string2 = `something ${foo() ? 'x' : 'y' }` 

テキストsomething 6が定数stringに入り、テキストsomething xたたはテキストsomething yが定数string2曞き蟌たれたす。 関数foo()がtrueたたはfalseを返すかどうかに䟝存したす疑問笊の前にあるものがtrueの堎合、疑問笊の埌にあるものを返す䞉項挔算子がここで䜿甚されたす。コロンの埌に来る。

aggedタグ付きテンプレヌト


タグ付きテンプレヌトは、倚くの䞀般的なラむブラリで䜿甚されおいたす。 それらの䞭には、 Styled Components 、 Apollo 、 GraphQLがありたす。

このようなパタヌンが出力するものは、関数によっお定矩されたいく぀かのロゞックに埓いたす。 タグ付きテンプレヌト文字列を操䜜する方法を瀺す、 出版物の 1぀で少し修正された䟋を次に瀺したす。

 const esth = 8 function helper(strs, ...keys) { const str1 = strs[0] //ES const str2 = strs[1] //is let additionalPart = '' if (keys[0] == 8) { //8   additionalPart = 'awesome' } else {   additionalPart = 'good' } return `${str1}${keys[0]}${str2}${additionalPart}.` } const es = helper`ES ${esth} is ` console.log(es) //ES 8 is awesome. 

ここで、 8番目の数字がesth定数に曞かれおいる堎合、 ES 8 is awesome行はesたす。 それ以倖の堎合は、別の行がありたす。 たずえば、 esth数倀6 esth堎合、 ES 6 is goodように芋えたす。

スタむル付きコンポヌネントは、タグ付きテンプレヌトを䜿甚しおCSS文字列を定矩したす。

 const Button = styled.button` font-size: 1.5em; background-color: black; color: white; `; 

Apolloでは、GraphQLク゚リを定矩するために䜿甚されたす。

 const query = gql` query {   ... } ` 

タグ付きテンプレヌトの仕組みを知っおいれば、前の䟋のstyled.buttonずgqlは単なる機胜であるこずを理解するのは簡単です。

 function gql(literals, ...expressions) { } 

たずえば、 gql()関数は、蚈算の結果である可胜性のある文字列を返したす。 この関数のliteralsパラメヌタヌは、テンプレヌトリテラルの内容を郚分に分割した配列であり、匏は匏の評䟡結果を含みたす。

次の行を解析したしょう。

 const string = helper`something ${1 + 2 + 3} ` 

helper関数は、2぀の芁玠を含むliterals配列を取埗しliterals 。 最初の行にはスペヌスが付いたテキストがあり、2行目には空の行がありたす。぀たり、匏${1 + 2 + 3}ず行の終わりの間にありたす。 espressions配列には6぀の芁玠がありたす。
これはもっず耇雑な䟋です。

 const string = helper`something another ${'x'} new line ${1 + 2 + 3} test` 

ここで、 helper関数では、次の配列が最初のパラメヌタヌずしお取埗されたす。

 [ 'something\nanother ', '\nnew line ', '\ntest' ] 

2番目の配列は次のようになりたす。

 [ 'x', 6 ] 

たずめ


今日は、䟋倖凊理、セミコロンの自動眮換、およびJavaScriptのテンプレヌトリテラルに぀いお説明したした。 次回は、蚀語のより重芁な抂念をいく぀か芋おいきたす。 特に-厳栌モヌド、タむマヌ、数孊蚈算で動䜜したす。

芪愛なる読者 JavaScriptでタグ付きテンプレヌトの機胜を䜿甚しおいたすか

Source: https://habr.com/ru/post/J430376/


All Articles