12知っおおくべきJavaScriptの抂念

JavaScriptは耇雑な蚀語です。 いずれかのレベルでJavaScript開発に携わっおいる堎合、この蚀語の基本抂念を理解するこずが重芁であるこずを意味したす。 本曞の翻蚳版は、12の重芁なJavaScriptの抂念をカバヌしおいたす。 もちろん、JavaScript開発者はもっず倚くのこずを知る必芁がありたすが、今日話そうずしおいるこずなくしお、圌は間違いなくできたせん。



1.倀ず参照を栌玍する倉数


JavaScriptで倉数倀がどのように正確に割り圓おられるかを理解するこずは、正しく機胜するコヌドを䜜成する人にずっお非垞に重芁です。 このメカニズムを誀解するず、倉数の倀が誀っお倉曎される可胜性のあるプログラムを䜜成するこずになりたす。

JavaScriptは、゚ンティティにプリミティブ型特にBoolean 、 null 、 undefined 、 StringおよびNumber型のいずれかがある堎合、垞にこの゚ンティティの倀を䜿甚したす。 ぀たり、倀は察応する倉数に曞き蟌たれたす。 オブゞェクト Object 、 Array 、 Functionタむプなどに぀いお話しおいる堎合、倉数に割り圓おるず、その参照がメモリにあるアドレスに曞き蟌たれたす。

䟋を考えおみたしょう。 次のコヌドスニペットでは、文字列がvar1倉数に曞き蟌たれたす。 その埌、 var2の倀がvar2倉数に曞き蟌たれたす。 var1にはプリミティブ型 String があるため、 var1の文字列のコピヌがvar1に曞き蟌たれvar1 。 これにより、 var2はvar1ず完党に独立した倉数ずvar2こずができたすが、 var1ず同じ倀を栌玍したす。 var1新しい倀をvar1もvar1は圱響したせん。

 let var1 = 'My string'; let var2 = var1; var2 = 'My new string'; console.log(var1); // 'My string' console.log(var2); // 'My new string' 

次に、オブゞェクトを操䜜する䟋を考えおみたしょう。

 let var1 = { name: 'Jim' } let var2 = var1; var2.name = 'John'; console.log(var1); // { name: 'John' } console.log(var2); // { name: 'John' } 

ご芧のずおり、ここではvar2倉数を䜿甚しおいたすが、同じオブゞェクトぞの参照を保存しおいるため、 var1倉数に反映されたす。 オブゞェクトを保存する倉数がプリミティブ型の倀を保存する倉数ず同じように振る舞うず誰かが刀断した堎合、実際のコヌドでこれが䜕に぀ながるか想像するのは簡単です。 これは、たずえば、枡されたオブゞェクト倀で動䜜するように蚭蚈された関数を䜜成し、この関数が誀っおこの倀を倉曎する堎合など、特に䞍快です。

2.短絡


クロヌゞングは​​、倉数を䜿甚しお保護された䜜業を敎理できるようにするJavaScriptの重芁なデザむンパタヌンです。 次の䟋では、 createGreeter()関数は、文字列Helloを含むgreeting匕数ずずもに提䟛される元の匕数にアクセスできる匿名関数を返したす。 この匿名関数ぞの参照は、 sayHello倉数に曞き蟌たれたす。 その埌、 sayHello()関数を䜕床呌び出しおも、垞にgreeting倀にアクセスできたす。 この堎合、 greetingぞのアクセスは匿名関数のみで、そのリンクはsayHello蚘録されたす。

 function createGreeter(greeting) { return function(name) {   console.log(greeting + ', ' + name); } } const sayHello = createGreeter('Hello'); sayHello('Joe'); // Hello, Joe 

これは非垞に簡単な䟋です。 珟実の䞖界に近いものを芋るず、たずえば、特定のAPIに接続するための関数 apiConnect()ず呌びたしょうapiConnect()できたす。最初に呌び出されたずきにAPIアクセスキヌが枡されたす。 次に、この関数は、 apiConnect()枡されるAPIアクセスキヌを䜿甚するいく぀かのメ゜ッドを含むオブゞェクトを返したす。 この堎合、キヌはクロヌゞャヌに保存され、これらのメ゜ッドを呌び出すずきに、キヌを蚘述する必芁はなくなりたした。

 function apiConnect(apiKey) { function get(route) {   return fetch(`${route}?key=${apiKey}`); } function post(route, params) {   return fetch(route, {     method: 'POST',     body: JSON.stringify(params),       headers: {         'Authorization': `Bearer ${apiKey}`       }     }) } return { get, post } } const api = apiConnect('my-secret-key'); //     API     api.get('http://www.example.com/get-endpoint'); api.post('http://www.example.com/post-endpoint', { name: 'Joe' }); 

3.砎壊的な割り圓お


JavaScriptで砎壊的な割り圓おをただ䜿甚しおいない堎合は、修正する時が来たした。 砎壊的な割り圓おは、きちんずした構文蚀語構造を䜿甚しおオブゞェクトプロパティを取埗する䞀般的な方法です。

 const obj = { name: 'Joe', food: 'cake' } const { name, food } = obj; console.log(name, food); // 'Joe' 'cake' 

オブゞェクトに含たれおいるものずは異なる抜出されたプロパティ名を割り圓おる必芁がある堎合、これを行うこずができたす。

 const obj = { name: 'Joe', food: 'cake' } const { name: myName, food: myFood } = obj; console.log(myName, myFood); // 'Joe' 'cake' 

次の䟋では、デストラクタリングを䜿甚しお、 personオブゞェクトのプロパティに栌玍されおいる倀を、 introduce()関数に正確に枡したす。 これは、枡されたパラメヌタヌを持぀オブゞェクトからデヌタを取埗する関数を宣蚀するずきに、この構造がどのように䜿甚されるかの䟋です。 ずころで、Reactに粟通しおいるのであれば、おそらくすでにこれを芋たこずがあるでしょう。

 const person = { name: 'Eddie', age: 24 } function introduce({ name, age }) { console.log(`I'm ${name} and I'm ${age} years old!`); } console.log(introduce(person)); // "I'm Eddie and I'm 24 years old!" 

4.スプレッド挔算子


スプレッド挔算子は、準備ができおいない人には理解できないず思われるかなり単玔な構造です。 次の䟋には、数倀配列があり、最倧倀が栌玍されおいたす。 これにはMath.max()メ゜ッドを䜿甚したすが、 Math.max()方法がわかりたせん。 圌は、匕数ずしお、独立した数倀を想定しおいたす。 配列から芁玠を抜出するために、3぀のポむントのように芋えるスプレッド挔算子を䜿甚したす。

 const arr = [4, 6, -1, 3, 10, 4]; const max = Math.max(...arr); console.log(max); // 10 

5.残りのステヌトメント


restステヌトメントを䜿甚するず、関数に枡された任意の数の匕数を配列に倉換できたす。

 function myFunc(...args) { console.log(args[0] + args[1]); } myFunc(1, 2, 3, 4); // 3 

6.配列メ゜ッド


配列メ゜ッドは、倚くの堎合、さたざたなデヌタ倉換タスクを矎しく解決できる䟿利なツヌルを開発者に提䟛したす。 StackOverflowに関する質問に時々答えたす。 その䞭には、オブゞェクトの配列を操䜜するこれらの方法たたは他の方法に専念しおいるものがよくありたす。 このような状況では、配列メ゜ッドが特に圹立ちたす。

ここでは、これらの方法のいく぀かを怜蚎したす。これらの方法は、互いに類䌌しおいるずいう原則に基づいおいたす。 ここで、配列のすべおの方法に぀いお説明するわけではないこずに泚意しおください。 MDNで完党なリストを芋぀けるこずができたすちなみに、これは私のお気に入りのJavaScriptリファレンスです。

▍Map、filter、reduceメ゜ッド


map() 、 filter()およびreduce()配列メ゜ッドを䜿甚するず、配列を倉換したり、配列を単䞀の倀オブゞェクトにするこずができたすにしたりできたす。

map()メ゜ッドは、凊理された配列の倉換された倀を含む新しい配列を返したす。 どのように正確に倉換されるかは、このメ゜ッドに枡される関数で指定されたす。

 const arr = [1, 2, 3, 4, 5, 6]; const mapped = arr.map(el => el + 20); console.log(mapped); // [21, 22, 23, 24, 25, 26] 

filter()メ゜ッドは芁玠の配列を返し、このメ゜ッドに枡された関数がtrue返した倀を確認したす。

 const arr = [1, 2, 3, 4, 5, 6]; const filtered = arr.filter(el => el === 2 || el === 4); console.log(filtered); // [2, 4] 

reduce()メ゜ッドは、配列のすべおの芁玠を凊理した結果である特定の倀を返したす。

 const arr = [1, 2, 3, 4, 5, 6]; const reduced = arr.reduce((total, current) => total + current); console.log(reduced); // 21 

▍メ゜ッドfind、findIndexおよびindexOf


配列メ゜ッドfind() 、 findIndex()およびindexOf() 、混同しやすいものです。 以䞋は、機胜の理解に圹立぀説明です。

find()メ゜ッドは、指定された基準に䞀臎する配列の最初の芁玠を返したす。 最初の適切な芁玠を芋぀けるこのメ゜ッドは、配列内の怜玢を続行したせん。

 const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const found = arr.find(el => el > 5); console.log(found); // 6 

この䟋では、数倀5を含む配列芁玠に続くすべおの配列芁玠が指定された基準に察応したすが、最初の適切な芁玠のみが返されるこずに泚意しおください。 このメ゜ッドは、forルヌプを䜿甚しお配列を列挙および分析する堎合に、 breakステヌトメントを䜿甚しお、配列内に目的の芁玠が芋぀かったずきにそのようなルヌプが䞭断される状況で非垞に圹立ちたす。

findIndex()メ゜ッドはfind()に非垞に䌌おいfind()が、配列内の最初の適切な芁玠を返す代わりに、その芁玠のむンデックスを返したす。 この方法をよりよく理解するために、文字列倀の配列を䜿甚する次の䟋を芋おください。

 const arr = ['Nick', 'Frank', 'Joe', 'Frank']; const foundIndex = arr.findIndex(el => el === 'Frank'); console.log(foundIndex); // 1 

indexOf()メ゜ッドはfindIndex() indexOf()メ゜ッドず非垞に䌌おいたすが、関数ではなく通垞の倀を匕数ずしお取りたす。 目的の配列芁玠を怜玢するずきに耇雑なロゞックが必芁ない堎合に䜿甚できたす。

 const arr = ['Nick', 'Frank', 'Joe', 'Frank']; const foundIndex = arr.indexOf('Frank'); console.log(foundIndex); // 1 

▍Push、pop、shift、およびunshiftメ゜ッド


push() 、 pop() 、 shift()およびunshift()を䜿甚しお、新しい芁玠を配列に远加し、それらにすでに存圚する芁玠を配列から抜出したす。 この堎合、䜜業は配列の先頭たたは末尟にある芁玠で実行されたす。

push()メ゜ッドを䜿甚するず、配列の末尟に芁玠を远加できたす。 配列を倉曎し、完了するず、配列に远加された芁玠を返したす。

 let arr = [1, 2, 3, 4]; const pushed = arr.push(5); console.log(arr); // [1, 2, 3, 4, 5] console.log(pushed); // 5 

pop()メ゜ッドは、配列から最埌の芁玠を削陀したす。 配列を倉曎し、そこから削陀された芁玠を返したす。

 let arr = [1, 2, 3, 4]; const popped = arr.pop(); console.log(arr); // [1, 2, 3] console.log(popped); // 4 

shift()メ゜ッドは、配列から最初の芁玠を削陀しお返したす。 たた、呌び出される配列を倉曎したす。

 let arr = [1, 2, 3, 4]; const shifted = arr.shift(); console.log(arr); // [2, 3, 4] console.log(shifted); // 1 

unshift()メ゜ッドは、配列の先頭に1぀以䞊の芁玠を远加したす。 圌は再び、配列を倉曎したす。 同時に、ここで説明した他の3぀のメ゜ッドずは異なり、配列の新しい長さを返したす。

 let arr = [1, 2, 3, 4]; const unshifted = arr.unshift(5, 6, 7); console.log(arr); // [5, 6, 7, 1, 2, 3, 4] console.log(unshifted); // 7 

▍メ゜ッドsliceおよびsplice


これらのメ゜ッドは、配列を倉曎したり、配列の䞀郚を返すために䜿甚されたす。

splice()メ゜ッドは、既存の芁玠を削陀するか、他の芁玠に眮き換えるこずにより、配列の内容を倉曎したす。 圌は配列に新しい芁玠を远加するこずができたす。 このメ゜ッドは配列を倉曎したす。

次の䟋は、通垞の蚀語で蚘述した堎合、次のようになりたす。配列䜍眮1で、 0芁玠を削陀し、 bを含む芁玠を远加する必芁がありたす。

 let arr = ['a', 'c', 'd', 'e']; arr.splice(1, 0, 'b') 

slice()メ゜ッドは、指定された開始䜍眮から始たり、指定された終了䜍眮の前の䜍眮で終わる、芁玠を含む配列の浅いコピヌを返したす。 呌び出し時に初期䜍眮のみが指定されおいる堎合、この䜍眮から開始しお配列党䜓を返したす。 このメ゜ッドは配列を倉曎したせん。 呌び出されたずきに蚘述されたこの配列の䞀郚のみを返したす。

 let arr = ['a', 'b', 'c', 'd', 'e']; const sliced = arr.slice(2, 4); console.log(sliced); // ['c', 'd'] console.log(arr); // ['a', 'b', 'c', 'd', 'e'] 

▍メ゜ッドsort


sort()メ゜ッドは、枡された関数で指定された条件に埓っお配列を゜ヌトしたす。 この関数は、配列の2぀の芁玠たずえば、パラメヌタヌaおよびbずしお衚すこずができたすを受け取り、それらを比范しお、芁玠を亀換する必芁がない堎合、0よりも䜎いむンデックスに配眮a必芁がある堎合a 0を返したすbは負の数であり、 bよりも䜎いむンデックスに配眮する必芁がある堎合は、正の数です。

 let arr = [1, 7, 3, -1, 5, 7, 2]; const sorter = (firstEl, secondEl) => firstEl - secondEl; arr.sort(sorter); console.log(arr); // [-1, 1, 2, 3, 5, 7, 7] 

これらの方法を初めお思い出せない堎合は、芚えおおいおも倧䞈倫です。 最も重芁なこずは、暙準の配列メ゜ッドで䜕ができるかに぀いお今知っおいるこずです。 したがっお、特定のメ゜ッドの機胜をすぐに思い出せない堎合、そのメ゜ッドに぀いお知っおいるこずで、ドキュメントで必芁なものをすばやく芋぀けるこずができたす。

7.ゞェネレヌタヌ


JavaScriptゞェネレヌタヌは、アスタリスク文字を䜿甚しお宣蚀されたす。 next()メ゜ッドが呌び出されたずきに返される倀を指定できたす。 ゞェネレヌタヌは、限られた数の倀を返すように蚭蚈できたす。 そのようなゞェネレヌタがそのような倀をすべお返した堎合、 next()次の呌び出しはundefinedを返したす。 サむクルを䜿甚しお無制限の数の倀を返すように蚭蚈されたゞェネレヌタヌを䜜成するこずもできたす。

以䞋は、限られた数の倀を返すように蚭蚈されたゞェネレヌタヌです。

 function* greeter() { yield 'Hi'; yield 'How are you?'; yield 'Bye'; } const greet = greeter(); console.log(greet.next().value); // 'Hi' console.log(greet.next().value); // 'How are you?' console.log(greet.next().value); // 'Bye' console.log(greet.next().value); // undefined 

そしお、ルヌプを通しお無限の倀を返すように蚭蚈されたゞェネレヌタヌがありたす。

 function* idCreator() { let i = 0; while (true)   yield i++; } const ids = idCreator(); console.log(ids.next().value); // 0 console.log(ids.next().value); // 1 console.log(ids.next().value); // 2 //   ... 

8.倀の等䟡性==および厳密な等䟡性===をチェックするための挔算子


JS開発者にずっお、等䟡 == 挔算子ず厳密な等䟡 === 挔算子の違いを理解するこずは非垞に重芁です。 事実は、倀を比范する前に挔算子==が型の倉換を実行し䞀芋するず奇劙な結果に぀ながる可胜性がありたす、挔算子===は型倉換を実行したせん。

 console.log(0 == '0'); // true console.log(0 === '0'); // false 

9.オブゞェクトの比范


私は時折、JSプログラミングの初心者が同じ間違いをする方法を確認する必芁がありたす。 オブゞェクトを盎接比范しようずしたす。 オブゞェクトが「栌玍される」倉数には、これらのオブゞェクト自䜓ではなく、それらぞの参照が含たれたす。

たずえば、次の䟋では、オブゞェクトは同じように芋えたすが、盎接比范するず、各倉数には独自のオブゞェクトぞのリンクが含たれおおり、これらのリンクは互いに等しくないため、オブゞェクトが異なるこずがわかりたす。

 const joe1 = { name: 'Joe' }; const joe2 = { name: 'Joe' }; console.log(joe1 === joe2); // false 

さらに、次の䟋では、䞡方の倉数が同じオブゞェクトぞの参照を栌玍しおいるため、 joe1はjoe1ず等しいこずがjoe2たす。

 const joe1 = { name: 'Joe' }; const joe2 = joe1; console.log(joe1 === joe2); // true 

実際のオブゞェクト比范の方法の1぀は、JSON文字列圢匏ぞの予備倉換です。 確かに、このアプロヌチには1぀の問題がありたす。オブゞェクトの結果の文字列衚珟では、プロパティの特定の順序が保蚌されないずいうこずです。 オブゞェクトを比范するより信頌性の高い方法は、オブゞェクトの詳现な比范のためのツヌルを含む特別なラむブラリを䜿甚するこずですたずえば、これはlodashラむブラリのisEqualメ゜ッドです。

オブゞェクトを比范するこずの耇雑さをよりよく理解し、異なる倉数で同じオブゞェクトぞのリンクを曞くこずの考えられる結果を理解するために、この蚘事で説明した最初のJSコンセプトを芋おください。

10.コヌルバック関数


コヌルバック関数は、初心者には難しい堎合があるかなり単玔なJavaScriptの抂念です。 次の䟋を考えおみたしょう。 ここで、 console.log関数そのように—括匧なしは、コヌルバック関数ずしおmyFunc()枡されたす。 この関数はタむマヌを蚭定し、その埌console.log()が呌び出され、 myFunc()枡された文字列がコン゜ヌルに衚瀺されたす。

 function myFunc(text, callback) { setTimeout(function() {   callback(text); }, 2000); } myFunc('Hello world!', console.log); // 'Hello world!' 

11.玄束


コヌルバック関数を孊習し、あらゆる堎所で䜿甚を開始するず、すぐにいわゆる「コヌルバック地獄」に陥りたす。 あなたが本圓にそこにいるなら-玄束を芋おみたしょう。 非同期コヌドはプロミスにラップするこずができ、実行が成功した埌、適切なメ゜ッドを呌び出しおプロミスの正垞な解決をシステムに䌝え、䜕か問題が発生した堎合は、これを瀺すメ゜ッドを呌び出しおプロミスを拒吊したす。 promiseによっお返された結果を凊理するには、 then()メ゜ッドを䜿甚し、゚ラヌ凊理にはcatch()メ゜ッドを䜿甚したす。

 const myPromise = new Promise(function(res, rej) { setTimeout(function(){   if (Math.random() < 0.9) {     return res('Hooray!');   }   return rej('Oh no!'); }, 1000); }); myPromise .then(function(data) {   console.log('Success: ' + data);  })  .catch(function(err) {   console.log('Error: ' + err);  }); //  Math.random()  , ,  0.9,    : // "Success: Hooray!" //  Math.random()  , ,  0.9,  0.9,    : // "Error: On no!" 

12. async / awaitコンストラクト


玄束を凊理した埌、おそらく、さらに䜕かが必芁になりたす。 たずえば、async / awaitコンストラクトをマスタヌしたす。 それは玄束のための構文糖衣です。 次の䟋では、 asyncを䜿甚しお非同期関数を䜜成し、その䞭でawaitキヌワヌドを䜿甚しawait 、greeter greeterするたで埅機greeterたす。

 const greeter = new Promise((res, rej) => { setTimeout(() => res('Hello world!'), 2000); }) async function myFunc() { const greeting = await greeter; console.log(greeting); } myFunc(); // 'Hello world!' 

たずめ


前にここで話したこずがあなたに銎染みのないものであれば、おそらく少なくずも少しですが、この蚘事を読んで自分より䞊に成長した可胜性が高いでしょう。 ここで新しいものを芋぀けおいない堎合は、この資料がJavaScriptの知識を実践および匷化する機䌚を䞎えおくれるこずを願っおいたす。

芪愛なる読者 この蚘事に远加する他のJavaScriptの抂念は䜕ですか

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


All Articles