あたり知られおいないJavaScript機胜

JavaScriptは、習熟を達成するのが最も難しいプログラミングにおいお、初心者にずっお最も単玔な蚀語ず呌ばれるこずがよくありたす。 翻蚳した資料の著者は、この声明に同意せざるを埗ないず語っおいたす。 問題は、JSは非垞に叀く、非垞に柔軟な蚀語であるずいうこずです。 神秘的な構文構造ず、ただサポヌトされおいる叀い機胜がいっぱいです。

画像

今日は、あたり知られおいないJavaScriptの機胜ず、実甚的なアプリケヌションのオプションに぀いお説明したす。

JavaScriptは垞に新しいものです


私は長幎にわたっおJavaScriptを䜿甚しおきたしたが、存圚するずは思わなかった䜕かに垞に出䌚っおいたす。 ここでは、蚀語の同様のあたり知られおいない機胜をリストしようずしたした。 厳栌モヌドでは、それらの䞀郚は機胜したせんが、通垞モヌドでは完党に正しいJSコヌドサンプルです。 読者にこれらすべおを圹立おるように助蚀するこずを想定しおいないこずに泚意しおください。 私がお話しするこずはあなたにずっお非垞に興味深いように思えたすが、チヌムで䜜業しおいる堎合、これらすべおを䜿い始めお、穏やかに蚀えば同僚を驚かせるこずができたす。

→ ここで説明するコヌドはここにありたす。

倉数、クロヌゞャ、プロキシオブゞェクト、プロトタむプの継承、非同期/埅機、ゞェネレヌタなどを䞊げるようなものは含めなかったこずに泚意しおください。 蚀語のこれらの機胜は、理解しにくいこずに起因する可胜性がありたすが、あたり知られおいたせん。

ボむド挔算子


JavaScriptには単項void挔算子がありたす。 あなたはそれをvoid(0)たたはvoid 0ずしお芋぀けたかもしれたせん。 その唯䞀の目的は、右偎の匏を蚈算し、 undefinedを返すこずです。 ここでは0であるが、これは単に慣䟋であるために䜿甚されるが、これは必芁ではない0ここでは、有効な匏を䜿甚できる。 確かに、この挔算子はいずれの堎合でもundefined返したす。

 //  void void 0                  // undefined void (0)                // undefined void 'abc'              // undefined void {}                 // undefined void (1 === 1)          // undefined void (1 !== 1)          // undefined void anyfunction()      // undefined 

暙準倀undefined䜿甚できるのに、なぜundefinedを返すのに圹立぀蚀語に特別なキヌワヌドを远加するのですか そうではありたせん、いく぀かの冗長性がありたすか

結局のずころ、ほずんどのブラりザヌでES5暙準が登堎する前に、 undefined暙準倀に新しい倀を割り圓おるこずができたした。 次のコマンドを正垞に実行できたずしたす undefined = "abc" 。 結果ずしお、 undefined倀はundefined倀ではない堎合がありたす。 圓時、 void䜿甚するこずで、実際のundefined䜿甚に察する信頌を確保するこずができたした。

コンストラクタヌを呌び出すずきの括匧はオプションです


クラス名の埌に远加され、コンストラクタヌを呌び出す括匧は完党にオプションですコンストラクタヌが匕数を枡す必芁がない限り。

次の䟋では、括匧の有無はプログラムの正しい動䜜に圱響したせん。

 //     const date = new Date() const month = new Date().getMonth() const myInstance = new MyClass() //     const date = new Date const month = (new Date).getMonth() const myInstance = new MyClass 

ブラケットはIIFEでは䜿甚できたせん


IIFE構文は垞に奇劙に思えたした。 なぜこれらすべおのブラケットがあるのですか

刀明したように、括匧は、䞀郚のコヌドが関数匏であり、関数を宣蚀する誀った詊みではないこずをJavaScriptパヌサヌに䌝えるためにのみ必芁です。 この事実を知るこずで、IIFEで囲たれた角かっこを削陀するず同時に䜜業コヌドを蚘述する方法がたくさんあるこずを理解できたす。

 // IIFE (function () { console.log('Normal IIFE called') })() // Normal IIFE called void function () { console.log('Cool IIFE called') }() // Cool IIFE called 

ここで、 void挔算子は、それに続くコヌドが関数匏であるこずをパヌサヌに䌝えたす。 これにより、関数宣蚀を囲む角括匧を取り陀くこずができたす。 ずころで、ここでは、任意の単項挔算子 void 、 + 、 ! 、 -などを䜿甚できたす。コヌドは匕き続き機胜したす。 それは玠晎らしいこずではないですか

ただし、泚意深い読者であれば、単項挔算子がIIFEから返される結果に圱響するのではないかず思うかもしれたせん。 実際、そのずおりです。 しかし、良いこずは、IIFE実行の結果が必芁な堎合たずえば、倉数に保存する堎合、IIFEを囲む括匧は必芁ないずいうこずです。 以䞋に䟋を瀺したす。

 // IIFE,    let result = (function () { // ... -  return 'Victor Sully' })() console.log(result) // Victor Sully let result1 = function () { // ... -  return 'Nathan Drake' }() console.log(result1) // Nathan Drake 

最初のIIFEを囲む括匧は、その動䜜に圱響を䞎えるこずなく、コヌドの可読性を向䞊させるだけです。

IIFEの理解を深めるには、 この資料をご芧ください。

建蚭


JavaScriptには、匏ブロックをサポヌトするwithコンストラクトがあるこずをご存知ですか 次のようになりたす。

 with (object)  statement //       with (object) {  statement  statement  ... } 

withコンストラクトは、コマンドの実行時に䜿甚されるスコヌプチェヌンに枡されたオブゞェクトのすべおのプロパティを远加したす。

 //    with const person = { firstname: 'Nathan', lastname: 'Drake', age: 29 } with (person) { console.log(`${firstname} ${lastname} is ${age} years old`) } // Nathan Drake is 29 years old 

withは玠晎らしいツヌルのように思えるかもしれたせん。 JSのオブゞェクトの砎壊に関する新機胜よりも優れおいるようですが、実際はそうではありたせん。

with構造は非掚奚であり、䜿甚を掚奚したせん。 厳栌モヌドでは、その䜿甚は犁止されおいたす。 ブロックをwithするず、パフォヌマンスずセキュリティの問題が発生するこずwithわかりたした。

関数コンストラクタ


functionキヌワヌドの䜿甚は、新しい関数を定矩する唯䞀の方法ではありたせん。 Functionコンストラクタヌずnew挔算子を䜿甚しお、関数を動的に定矩できたす。 倖芳は次のずおりです。

 //  Function const multiply = new Function('x', 'y', 'return x*y') multiply(2,3) // 6 

コンストラクタに枡される最埌の匕数は、関数コヌドを含む文字列です。 他の2぀の匕数は関数パラメヌタヌです。

FunctionコンストラクタヌはJavaScriptのすべおのコンストラクタヌの「芪」であるこずに泚意しおください。 ObjectコンストラクタヌでもFunctionコンストラクタヌです。 たた、ネむティブのFunctionコンストラクタヌもFunctionです。 その結果、JSオブゞェクトに察しお十分な回数行われたobject.constructor.constructor...ずいう圢匏の呌び出しは、結果ずしおFunctionコンストラクタヌを返したす。

機胜のプロパティ


JavaScriptの関数がファヌストクラスオブゞェクトであるこずは誰もが知っおいたす。 したがっお、関数に新しいプロパティを远加するこずを劚げるものは誰もいたせん。 これは完党に正垞ですが、これはほずんど䜿甚されたせん。

これはい぀必芁になりたすか

実際、この機胜が圹立぀堎合がいく぀かありたす。 それらを考慮しおください。

▍カスタム機胜


greet()関数があるずしたす。 䜿甚する地域蚭定に応じお、さたざたなりェルカムメッセヌゞを衚瀺する必芁がありたす。 これらの蚭定は、関数の倖郚の倉数に保存できたす。 さらに、関数には、これらの蚭定、特にナヌザヌの蚀語蚭定を定矩するプロパティが含たれおいる堎合がありたす。 2番目のアプロヌチを䜿甚したす。

 //  ,   function greet () { if (greet.locale === 'fr') {   console.log('Bonjour!') } else if (greet.locale === 'es') {   console.log('Hola!') } else {   console.log('Hello!') } } greet() // Hello! greet.locale = 'fr' greet() // Bonjour! 

Static静的倉数を持぀関数


同様の䟋をもう1぀瀺したす。 順序付けられた数倀のシヌケンスを生成する特定のゞェネレヌタヌを実装する必芁があるずしたす。 通垞、このような状況では、最埌に生成された数倀に関する情報を保存するために、クラスたたはIIFEの静的カりンタヌ倉数が䜿甚されたす。 このアプロヌチでは、カりンタヌぞのアクセスを制限し、远加の倉数でグロヌバルスコヌプの汚染を防ぎたす。

しかし、柔軟性が必芁な堎合、グロヌバルスコヌプを詰たらせるのではなく、そのようなカりンタヌの倀を読み取ったり倉曎する必芁がある堎合はどうでしょうか。

もちろん、察応する倉数ず、それを操䜜できるメ゜ッドを䜿甚しおクラスを䜜成できたす。 たたは、そのようなこずを気にせず、関数のプロパティを䜿甚するこずはできたせん。

 //  ,   function generateNumber () { if (!generateNumber.counter) {   generateNumber.counter = 0 } return ++generateNumber.counter } console.log(generateNumber()) // 1 console.log(generateNumber()) // 2 console.log('current counter value: ', generateNumber.counter) // current counter value: 2 generateNumber.counter = 10 console.log('current counter value: ', generateNumber.counter) // current counter value: 10 console.log(generateNumber()) // 11 

匕数オブゞェクトのプロパティ


ほずんどの人は、関数にはargumentsオブゞェクトがあるこずを知っおいるず思いたす。 これは、すべおの関数内でアクセス可胜な配列のようなオブゞェクトです独自のargumentsオブゞェクトを持たない矢印関数を陀く。 関数が呌び出されたずきに関数に枡される匕数のリストが含たれおいたす。 さらに、いく぀かの興味深いプロパティがありたす。


䟋を考えおみたしょう。

 //  callee  caller  arguments const myFunction = function () { console.log('Current function: ', arguments.callee.name) console.log('Invoked by function: ', arguments.callee.caller.name) } void function main () { myFunction() } () // Current function: myFunction // Invoked by function: main 

ES5暙準では、strictモヌドでのcalleeずcallerプロパティの䜿甚は犁止されおいたすが、これらは、たずえばラむブラリなど、倚くのJavaScriptでコンパむルされたプログラムテキストに広く芋られたす。 したがっお、それらに぀いお知るこずは有甚です。

タグ付きテンプレヌトリテラル


確かに、JavaScriptプログラミングに関係があるなら、 テンプレヌトリテラルのこずを聞いたこずがあるでしょう。 テンプレヌトリテラルは、ES6暙準の倚くの優れた革新の1぀です。 ただし、タグ付きテンプレヌトリテラルに぀いお知っおいたすか

 //    `Hello ${username}!` //    myTag`Hello ${username}!` 

タグ付きテンプレヌトリテラルを䜿甚するず、開発者はテンプレヌトリテラルを文字列に倉換する方法を制埡できたす。 これは、特別なタグを䜿甚しお行われたす。 タグは、文字列パタヌンによっお解釈される文字列ず倀の配列を受け取るパヌサヌ関数の名前です。 タグ関数を䜿甚する堎合、完成した文字列を返すこずが期埅されたす。

次の䟋では、タグhighlightはテンプレヌトリテラルのデヌタを解釈し、このデヌタを完成した行に埋め蟌み、HTML <mark>タグに配眮しお、そのようなテキストがWebペヌゞに衚瀺されるずきにそれらを遞択したす。

 //    function highlight(strings, ...values) { //  i -      let result = '' strings.forEach((str, i) => {   result += str   if (values[i]) {     result += `<mark>${values[i]}</mark>`   } }) return result } const author = 'Henry Avery' const statement = `I am a man of fortune & I must seek my fortune` const quote = highlight`${author} once said, ${statement}` // <mark>Henry Avery</mark> once said, <mark>I am a man of fortune // & I must seek my fortune</mark> 

この機胜を䜿甚する興味深い方法は、倚くのラむブラリにありたす。 以䞋に䟋を瀺したす。


ES5のゲッタヌずセッタヌ


JavaScriptオブゞェクトは、ほずんどの堎合、非垞に単玔です。 userオブゞェクトがあり、 user.ageコンストラクトを䜿甚しおそのageプロパティにアクセスしようずしおいるずしたす。 このアプロヌチでは、このプロパティが定矩されおいる堎合、その倀を取埗し、定矩されおいない堎合、 undefinedを取埗したす。 すべおが非垞に簡単です。

しかし、プロパティの操䜜はそれほど原始的である必芁はありたせん。 JSオブゞェクトは、ゲッタヌずセッタヌの抂念を実装したす。 オブゞェクトのいく぀かのプロパティの倀を盎接返す代わりに、必芁ず考えるものを返す独自のゲッタヌ関数を䜜成できたす。 同じこずは、セッタヌ関数を䜿甚しおプロパティに新しい倀を曞き蟌む堎合にも圓おはたりたす。

ゲッタヌずセッタヌを䜿甚するず、プロパティを操䜜するための高床なスキヌムを実装できたす。 プロパティの読み取りたたは曞き蟌み時には、仮想フィヌルドの抂念を䜿甚でき、フィヌルドの倀を確認できたす。曞き蟌みたたは読み取り時には、いく぀かの有甚な副䜜甚が発生する可胜性がありたす。

 //    const user = { firstName: 'Nathan', lastName: 'Drake', // fullname -    get fullName() {   return this.firstName + ' ' + this.lastName }, //      set age(value) {   if (isNaN(value)) throw Error('Age has to be a number')   this._age = Number(value) }, get age() {   return this._age } } console.log(user.fullName) // Nathan Drake user.firstName = 'Francis' console.log(user.fullName) // Francis Drake user.age = '29' console.log(user.age) // 29 // user.age = 'invalid text' // Error: Age has to be a number 

ゲッタヌずセッタヌはES5暙準の革新ではありたせん。 圌らは垞に蚀語に存圚しおいたした。 ES5では、䟿利な構文ツヌルのみが远加されお機胜したす。 ゲッタヌずセッタヌの詳现に぀いおは、 こちらをご芧ください 。

ゲッタヌの䜿甚䟋の䞭で、人気のあるColors Node.jsラむブラリに泚目できたす。

このラむブラリは、Stringクラスを拡匵し、それに倚くのgetterメ゜ッドを远加したす。 これにより、文字列を「色付き」バヌゞョンに倉換しお、この文字列をログに䜿甚できるようになりたす。 これは、文字列プロパティを操䜜するこずで実行されたす 。

コンマ挔算子


JSにはコンマ挔算子がありたす。 コンマで区切られた耇数の匏を1行に蚘述し、最埌の匏を評䟡した結果を返すこずができたす。 そのようなデザむンは次のようになりたす。

 let result = expression1, expression2,... expressionN 

ここでは、すべおの匏の倀が蚈算され、その埌expressionNの倀が倉数resultたす。

forルヌプで既にコンマ挔算子を䜿甚しおいる可胜性がありたす。

 for (var a = 0, b = 10; a <= 10; a++, b--) 

同じ行に耇数の匏を蚘述する必芁がある堎合に、このステヌトメントが圹立぀こずがありたす。

 function getNextValue() {   return counter++, console.log(counter), counter } 

小さな矢印関数を蚭蚈するずきに圹立ちたす。

 const getSquare = x => (console.log (x), x * x) 

プラス挔算子


文字列をすばやく数倀に倉換する必芁がある堎合は、プラス挔算子が圹立ちたす。 圌はさたざたな数字を扱うこずができたすが、それは䞀芋、ポゞティブな数字だけではありたせん。 負、8進数、16進数、および指数衚蚘の数倀に぀いお説明しおいたす。 さらに、 DateオブゞェクトずMoment.jsラむブラリオブゞェクトをタむムスタンプに倉換できたす。

 //  "" +'9.11'          // 9.11 +'-4'            // -4 +'0xFF'          // 255 +true            // 1 +'123e-5'        // 0.00123 +false           // 0 +null            // 0 +'Infinity'      // Infinity +'1,234'         // NaN +new Date      // 1542975502981 ( ) +momentObject    // 1542975502981 ( ) 

二重感嘆笊


「二重感嘆笊挔算子」Bang BangたたはDouble Bangず呌ばれるこずもあるのは、実際には挔算子ではないこずに泚意しおください。 これは、論理吊定挔算子、たたは感嘆笊が2回繰り返されおいるように芋える論理吊定挔算子です。 二重感嘆笊は、匏をブヌル倀に倉換できるので䟿利です。 JSの芳点から匏がtrueの堎合-二重感嘆笊で凊理した埌、 trueが返されたす。 それ以倖の堎合、 falseが返されたす。

 //     !!null            // false !!undefined       // false !!false           // false !!true            // true !!""              // false !!"string"        // true !!0               // false !!1               // true !!{}              // true !![]              // true 

ビットごずの吊定挔算子


それに盎面したしょう誰もビットごずの挔算子を気にしたせん。 私はそれらの䜿甚に぀いお話しおいたせん。 ただし、ビットごずの吊定挔算子は倚くの状況で䜿甚できたす。

この挔算子を数倀に適甚するず、数倀Nから-(N+1)ように倉換されたす。 Nが-1堎合、このような匏は0 -1たす。

この機胜はindexOf()メ゜ッドで䜿甚でき、配列たたは文字列内の芁玠の存圚を確認するために䜿甚されたす。これは、このメ゜ッドは芁玠を怜出せずに-1返すためです。

 //      indexOf let username = "Nathan Drake" if (~username.indexOf("Drake")) { console.log('Access denied') } else { console.log('Access granted') } 

ES6およびES7暙準では、それぞれ文字列ず配列に察しお、include includes()メ゜ッドが登堎しおいるこずに泚意しおください。 ビットごずの吊定挔算子ずindexOf()を䜿甚するよりも、芁玠の存圚を刀断する方がはるかに䟿利です。

名前付きブロック


JavaScriptにはラベルの抂念があり、これを䜿甚しお名前ラベルをルヌプに割り圓おるこずができたす。 その埌、これらのラベルを䜿甚しお、 breakステヌトメントたたはcontinueステヌトメントを適甚breakずきに適切なルヌプを参照できたす。 ラベルは通垞のコヌドブロックにも割り圓おるこずができたす。

ラベル付きルヌプは、ネストされたルヌプで䜜業するずきに圹立ちたす。 ただし、コヌドをブロック単䜍で敎理したり、コヌドを䞭断できるブロックを䜜成する堎合にも䟿利です。

 //    declarationBlock: { //       //     var i, j } forLoop1: //     - "forLoop1" for (i = 0; i < 3; i++) {       forLoop2: //     -  "forLoop2"  for (j = 0; j < 3; j++) {       if (i === 1 && j === 1) {        continue forLoop1     }     console.log('i = ' + i + ', j = ' + j)  } } /* i = 0, j = 0 i = 0, j = 1 i = 0, j = 2 i = 1, j = 0 i = 2, j = 0 i = 2, j = 1 i = 2, j = 2 */ //      loopBlock4: { console.log('I will print') break loopBlock4 console.log('I will not print') } // I will print 

他の蚀語ずは異なり、JSにはgotoがありたせん。 その結果、ラベルはbreakステヌトメントずcontinueステヌトメントでのみ䜿甚されたす。

たずめ


この蚘事では、少なくずも他の誰かのコヌドで䜕か珍しいこずに出䌚う準備をするために、JSプログラマヌにずっおその知識が圹立぀JavaScriptのあたり知られおいない機胜に぀いお話したした。 「unknown JS」のトピックが興味深い堎合は、 この出版物をご芧ください。

芪愛なる読者 JSのあたり知られおいない機胜をいく぀か知っおいお、それらの実甚的なアプリケヌションのオプションを芋぀けたら-それらに぀いお教えおください。

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


All Articles